Webpart需要访问Sharepoint List(读取模式)。如果用户是admin,则没有问题(按预期工作),但如果用户没有访问权限,我必须使用“RunWithElevatedPrivileges”方法。
问题是,查询似乎没有返回正确的结果。我缺少什么?
SPList demoList = null;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPSite oSite = SPControl.GetContextSite(HttpContext.Current); // ADDED
SPWeb oWeb = oSite.OpenWeb(); // ADDED
demoList = oWeb.Lists["nameList"];
});
// demoList has 3 Elements (admin and no admin user) OK
SPListItemCollection collListItems = null;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPQuery oQuery = new SPQuery() { Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" };
collListItems = demoList.GetItems(oQuery);
});
//
//IF ADMIN
//collListItems.Count ==>3
//IF NO ADMIN
//collListItems.Count ==>0
答案 0 :(得分:6)
您需要使用提升的权限创建新对象。
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPSite oSite = new SPSite(SPContext.Current.Site.ID);
SPWeb oWeb = oSite.OpenWeb(SPContext.Current.Web.ID);
demoList = oWeb.Lists["nameList"];
});
此外,您应该处理新创建的对象,而不需要两个代表。
SPSecurity.RunWithElevatedPrivileges(delegate {
using (SPSite oSite =new SPSite(SPContext.Current.Site.ID))
using (SPWeb oWeb = oSite.OpenWeb()) {
var demoList = oWeb.Lists["nameList"];
SPQuery oQuery = new SPQuery
{ Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" };
SPListItemCollection collListItems = demoList.GetItems(oQuery);
//IF ADMIN
//collListItems.Count ==>3
//IF NO ADMIN
//collListItems.Count ==>0
}
});
答案 1 :(得分:4)
如果在提升块之外创建站点和Web对象(或从当前SPContext访问它们),则它们将具有当前登录用户的权限。因此,即使查询位于高架块中,您的查询也不会使用提升的权限。您需要在提升的块内创建新的Site和Web对象,然后访问列表,然后运行查询以获得预期的结果。
这是一个进一步解释的资源。尽管它是针对SharePoint 2007完成的,但它适用于SharePoint 2010。
在Windows SharePoint Services 3.0中运行具有提升权限的命令 http://msdn.microsoft.com/en-us/library/bb466220(v=office.12).aspx
答案 2 :(得分:0)
如果要在SharePoint列表中包含写入操作,请在RWEP方法之前添加SPWeb.ValidateFormDigest()
或SPUtility.ValidateFormDigest()
行。
SPUtility.ValidateFormDigest();
SPSecurity.RunWithElevatedPrivileges(delegate()
{
}