SharePoint开发权限
嗨我正在使用SharePoint命名空间从整个站点的各种列表中提取项目。我的网站部分工作,但只在我的帐户。当我在另一个帐户上尝试它时,它会为我提供“错误:访问被拒绝”页面。我把所有的网页部分都拿出来了,并且在网页上只有这个网页部分。当我删除下面的行时,为每个人加载页面,当我将其添加回来,但它不起作用。我猜这是一些权限问题。我想知道是否有编程方式通过分配用户ID使用查询SharePoint上的不同列表?感谢您的帮助SharePoint开发权限
...
SPSite site = new SPSite(_SPSite);
SPWeb eachWeb = site.AllWebs[0];
SPListItemCollection myItemCollection = eachWeb.Lists["Listings"].Items;
...
尝试:
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对象。
Ahhh .... SharePoint开发。简单的数据访问会变得很麻烦。 – Jim 2009-02-20 19:22:50
但这是一个“功能”!实际上,SharePoint API中的自动安全修整功能非常经常使用,但是有太多人在具有上帝特权的环境中开发和测试,并且想知道为什么在生产环境中为匿名/低权限的帐户打破了原因。 – 2009-02-20 20:48:03