SharePoint 2010更改RunWithElevatedPrivileges的上下文

时间:2011-12-13 21:21:01

标签: sharepoint sharepoint-2010 sitecollection

我有两个网站集,我们只需要将它们称为A和B.在A中,我列出了一些内容,我希望在多个网站集中进行同步。我创建了一个自定义内容查询Web部件,用于查询数据,但我遇到了路障。

由于用户级帐户根本无法访问站点A,并且我不希望他们在任何级别访问此站点,因此当我的Web部件在站点B上运行时,我收到拒绝访问错误有没有办法改变RunWithElevatedPrivileges的工作环境?

我从网站集B运行的当前代码看起来像

ClientContext clientContext = new ClientContext(siteAUrl);
SP.List oList = clientContext.Web.Lists.GetByTitle(listName);

CamlQuery query = new CamlQuery();
//Add View, Execute Query, etc.

return results;

如果我将它包装在SPSecurity.RunWithElevatedPrivileges中,它会在网站集B上下文中提升运行,我希望它在网站集A上下文中运行。

2 个答案:

答案 0 :(得分:4)

SharePoint 2010客户端对象模型不支持SPSecurity.RunWithElevatedPrivileges。由于@Nat声明此调用将线程标识还原为应用程序池帐户(SystemAccount)。由于您的代码在客户端上运行 ,因此无法将身份还原到应用程序池帐户。 通过客户端对象模型将代码作为系统帐户运行会打开安全漏洞。每个人都可以作为管理员编写和执行代码。

如果您的代码在服务器上运行,您可以使用SPUserToken.SystemAccount使用系统帐户凭据打开SPSite

using (SPSite site = new SPSite("http://someurl", SPUserToken.SystemAccount))
{
  // admin action here
}

查看我的博文How to Open a SPSite with System Account Credentials以获取更多信息。

答案 1 :(得分:2)

请记住,SPSecurity.RunWithElevatedPrivileges正在运行应用程序池帐户的安全上下文中的代码。 因此,除非您在不同的Web应用程序中运行网站集,否则它们将具有相同的上下文。即所有被调查者的主人。

如果您正在跨网站集运行,则应用程序池帐户将指定其他Web应用程序的权限。