2016-04-13 63 views
0

虽然我运行代码SPSecurity.RunWithElevatedPrivileges,但我尝试打开SPFolder时遇到Access Denied错误。我找到关于此主题的几个职位,而我发现了解决方案:Sharepoint访问被拒绝RunWithElevatedPrivileges for SPFolder

  • 不要使用SPContext.Current
  • 实例化人SPObject的RunWithElevatedPrivileges
  • 里面设置为false SPSecurity.CatchAccessDeniedException

没有什么作品为了我。按照我的代码,错误发生在:

SPFolder DocumentLibrary = web.Folders[Library]; 

我的代码:

bool originalCatchValue = SPSecurity.CatchAccessDeniedException; 
SPSecurity.CatchAccessDeniedException = false; 

try 
{ 
    string[] ArrayId = Request["arrayId"].ToString().Split('|'); 
    string company = Request["company"].ToString(); 
    string NewSPContext = company == "XXX" ? siteCollectionUrl.Replace("XXX", "") : siteCollectionUrl + "XXX"; 
    SPUserToken userToken = SPContext.Current.Web.CurrentUser.UserToken; 
    foreach (string id in ArrayId) 
    { 
     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      SPSite oSite = new SPSite(siteCollectionUrl, userToken); 
      SPWeb oWeb = oSite.OpenWeb(); 
      SPFile itemFile = FindListByName(oWeb, Library).GetItemById(int.Parse(id)).File; 
      using (SPSite site = new SPSite(NewSPContext, userToken)) 
      using (SPWeb web = site.OpenWeb()) 
      { 
       var test = web.CurrentUser; 
       web.AllowUnsafeUpdates = true; 
       SPFolder DocumentLibrary = web.Folders[Library]; 
       DocumentLibrary.Files.Add(itemFile.Item.Name, itemFile.OpenBinary(), itemFile.Properties, true); 
       DocumentLibrary.Update(); 
      } 
     }); 
    } 
    Response.Write("OK"); 
} 
finally 
{ 
    SPSecurity.CatchAccessDeniedException = originalCatchValue; 
} 
+0

请不要将标题更改为“已解决”。如果某个答案解决了问题,则将其标记为答案并注册,以表示赞赏并指出(解决类似问题的其他人)解决问题的方法。 – Sufian

回答

0

当你提供一个用户令牌到的SPSite类的构造函数,创建的实例会在的上下文中运行指定的用户。这意味着,就你的情况而言,你在oSite对象上执行的每个操作都将被执行,就好像被CurrentUser调用一样。

只需从您实例化SPSite对象的行中删除用户令牌参数,并且自从您的代码提升权限以来,应该很好。

话虽如此,您的代码有多个问题。至少可以说,这是非常低效的,它不会通过代码审查。下面是一些提示您:

  • 避免RunWithElevatedPrivileges函数的递归调用,这是一个非常昂贵的功能。

  • 尝试重新使用SPSite和SPWeb对象,一旦实例化它们而不是在循环中递归地重新创建它们。他们构建起来非常昂贵。

  • 您必须处理SPSite和SPWeb对象的所有实例,否则最终会导致内存泄漏,从而导致应用程序性能随着时间的推移而恶化,最可能导致最终崩溃。

+0

谢谢Serkan。我知道代码不好。这是在我的实验中,以解决问题。说,在这段代码中,我试图将文档从一个站点复制到另一个站点。我使用当前令牌打开网站,因为我想让当前用户作为复制文档的创建者,而不会将权限授予第二个网站上的用户。有可能的? –

+0

只要当前用户对两个位置都有足够的访问权限,那么即使不提升执行上下文,您的代码也可以正常工作。如果不是这样,那么在将文件上传到目标站点后,在相同的函数调用中,可以使用当前用户的名称更新新创建的文档的创建者字段。这是通过迁移工具通常完成的工作,以保留文档的原始元数据。所以,这是一个成熟的解决方案...... –