SharePoint开发权限

问题描述:

嗨我正在使用SharePoint命名空间从整个站点的各种列表中提取项目。我的网站部分工作,但只在我的帐户。当我在另一个帐户上尝试它时,它会为我提供“错误:访问被拒绝”页面。我把所有的网页部分都拿出来了,并且在网页上只有这个网页部分。当我删除下面的行时,为每个人加载页面,当我将其添加回来,但它不起作用。我猜这是一些权限问题。我想知道是否有编程方式通过分配用户ID使用查询SharePoint上的不同列表?感谢您的帮助SharePoint开发权限

... 
SPSite site = new SPSite(_SPSite);   
SPWeb eachWeb = site.AllWebs[0]; 
SPListItemCollection myItemCollection = eachWeb.Lists["Listings"].Items; 
... 

您是对的,当您使用的帐户无法访问当前网站中的“列表”列表时,访问被拒绝错误发生。

解决这个问题的最简单方法是使用SPSecurity.RunWithElevatedPrivleges电话:

SPSecurity.RunWithElevatedPrivleges(delegate() 
{ 
    //Your code here 
}); 

将运行任何代码使用SharePoint /系统帐户包含在匿名方法,授予完全控制。虽然使用这种技术时要小心,因为它相当于以超级用户帐户完全信任地运行代码。还有othercaveats也需要注意。

+0

Ahhh .... SharePoint开发。简单的数据访问会变得很麻烦。 – Jim 2009-02-20 19:22:50

+0

但这是一个“功能”!实际上,SharePoint API中的自动安全修整功能非常经常使用,但是有太多人在具有上帝特权的环境中开发和测试,并且想知道为什么在生产环境中为匿名/低权限的帐户打破了原因。 – 2009-02-20 20:48:03

尝试:

SPWeb eachWeb = SPContext.Current.Site.RootWeb.Webs[0]; 
SPListItemCollection myItemCollection = eachWeb.Lists["Listings"].Items; 

记住的SPWeb应在using块中使用,或使用后废弃的明确。

由于从EvilGoatBob关于第一个警告,我引用:

“如果你在操纵你的高架方法中的任何对象模型元素,你需要得到这个里面调用一个新的SPSite参考例如

。 。
SPSecurity.RunWithElevatedPrivileges(delegate(){ 
    SPSite mySite = new SPSite(http://sharepoint/); 
    SPWeb myWeb = SPSite.OpenWeb(); 
    // further implementation omitted 
});" 

注意,该网站的参数是硬编码 - 这是因为一个错误的如果你不是曾试图:

使用(SPSite的网站=新的SPSite(“HTTP://” +统环境.MachineName)){}

您会得到相当通用的“没有SharePoint网站存在于指定的URL ...”错误。这使我无法结束悲痛。底线是,你必须硬编码的服务器名称(除非任何人有一个替代)。使用VSeWSS 1.3第一次调试Web部件时,您也可能会收到类似的错误消息。

需要硬编码服务器名称在这种情况下,因为您的要求是检索相同网站为您的WebPart内从列表中的项目。你是正确的,如果你没有足够的权限与你的帐户,那么你会得到拒绝访问。该解决方案是创建一个不同的安全环境中一个新的SPSite对象,并做你的工作:

SPSecurity.RunWithElevatedPrivileges(delegate() 
    { 
     using (SPSite site = new SPSite(SPContext.Current.Site.Url)) 
     { 
      using (SPWeb web = site.OpenWeb()) 
      { 
       //the web object was retrieved with elevated privileges under the system account. 

       //do your work here: 
       SPListItemCollection myItemCollection = web.Lists["Listings"].Items; 

       //... 
      } 
     } 
    } 
    ); 

通过上面的代码,你的web部件是可移植的,因为没有硬编码,并运行在正确的安全上下文而配置所有由SPSite和SPWeb构造函数创建的非托管SPRequest对象。