1

Webpart 需要访问 Sharepoint 列表(读取模式)。如果用户是管理员,则没有问题(按预期工作),但如果用户没有访问权限,我必须使用“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
4

3 回答 3

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
    }
});
于 2011-05-18T11:11:05.060 回答
4

如果您在提升的块之外创建站点和 Web 对象(或从当前 SPContext 访问它们),它们将拥有当前登录用户的权限。因此,即使您的查询位于提升的块中,也没有使用提升的权限。您需要在提升的块内创建新的站点和 Web 对象,然后访问列表,然后运行查询以获得预期的结果。

这是进一步解释的资源。即使它是为 SharePoint 2007 完成的,它也适用于 SharePoint 2010。

在 Windows SharePoint Services 3.0 中运行具有提升权限的命令 http://msdn.microsoft.com/en-us/library/bb466220(v=office.12).aspx

于 2011-05-18T10:52:16.830 回答
0

如果要在 SharePoint 列表中包含写入操作,请 在 RWEP 方法之前添加SPWeb.ValidateFormDigest()或行。SPUtility.ValidateFormDigest()

SPUtility.ValidateFormDigest();
SPSecurity.RunWithElevatedPrivileges(delegate()
{

}
于 2014-07-04T17:49:18.977 回答