方法: SPSecurity.RunWithElevatedPrivileges
命名空间: Microsoft.SharePoint
程序集: Microsoft.SharePoint (in microsoft.sharepoint.dll)
使用方法:
SPSecurity.RunWithElevatedPrivileges(delegate ()
{
using (SPSite site = new SPSite(web.Site.ID))
{
// implementation details omitted
}
});
注意:
你必须在delegate的内部 创建新的SPSite对象, 因为外面创建的SPSite 对象即使你在delegate内部引用, 它还是没有完全控制的权限的. 使用using 关键字来保证SPSite对象在delegate内部被析构掉.
另外, 该方法的行为是将当前账户提升为IIS的application pool的账户, 即web应用程序的管理员账户, 从而获得完全控制权限的.
原文出处有更详细的例子.
补充
=======
这个方法与ASP.NET的impersonate有什么不同呢?
嗯, 后者要么要动web.config, 要么就需要在代码中hard code下来你要使用的用户名和密码. 相对于SharePoint Object Model提供的这个方法来说, 缺点还是比较明显的. 所以在SharePoint中, 要用还是用OM的吧.
摘自:
This page is specific to The 2007 product release
在编写WebPart或EventHandler时,当前登录网站的是一个只具有普通权限如查看而没有编辑添加权限的用户,而在这个网站中存在一个 利用当前登录网站用户的权限去执行向某列表或文档库中添加新记录的WebPart里的代码,但是这时当前登录的用户并没有相应的对列表或文档库添加新记录 的权限,这时就要在WebPart的代码里做文章了,这就是我要提到的模拟提升当前用户的权限以更高的权限来运行代码。
在MOSS 代码中用来提升权限,模拟成站点管理员的权限,在这过程需要用户MOSS里的对象模型里的 SPSecurity.RunWithElevatedPrivileges来进行。 SPSecurity.RunWithElevatedPrivileges对象是可以将当前用户在代码里的安全上下文凭据提升模拟成当前站点的管理员的 权限运行此代码。
如第一种情况:
//模拟提升权限
SPSecurity.RunWithElevatedPrivileges(delegate
{
//创建指定站点集
using (SPSite site = new SPSite("http://moss "))
{
//打开网站
using (SPWeb web = site.OpenWeb())
{
//允许更新网站
web.AllowUnsafeUpdates = true;
//打开所属的文档库
SPList list = web.Lists[ListName];
………….
web.AllowUnsafeUpdates = false;
}
}
});
这种情况下创建的SPSite对象会以全新的身份就是以站点管理员(SPSAdmin)的身份来运行下面的方法体的,而不是当前登录用户真正在此网站里的权限。
如第二种情况:
//创建指定站点集
using (SPSite site = new SPSite("http://moss "))
{
//模拟提升权限
SPSecurity.RunWithElevatedPrivileges(delegate
{
//打开网站
using (SPWeb web = site.OpenWeb())
{
//允许更新网站
web.AllowUnsafeUpdates = true;
//打开所属的文档库
SPList list = web.Lists[ListName];
………….
web.AllowUnsafeUpdates = false;
}
});
}
这 种情况那么所创建的用户安全上下文的权限就是以当前登录用户在此网站中真正实际权限来运行接下来的代码方法体,虽然代码中创建的SPWeb对象打开网站是 在SPSecurity.RunWithElevatedPrivileges模拟权限的方法块中运行,但根据代码的运行结果可以看出 SPSecurity.RunWithElevatedPrivileges对象并没有起到提升权限的效果。
这两种说明了在SPSecurity.RunWithElevatedPrivileges对象方法块中创建站点SPSite对象所产生的运行效果是完全不同的。
上面谈到的是用系统管理员帐号和登陆用户去执行代码的,当然我们也可以指定运行代码的帐号:
如第三种情况:
SPSite siteColl = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
SPUser user = site.Users[@“username@moss.com ”];
SPUserToken userToken = user.UserToken;
SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite ElevatedsiteColl = new SPSite(siteColl.ID, userToken)) {
using (SPWeb ElevatedSite = ElevatedsiteColl.OpenWeb(site.ID))
{ //以litware"ken身份运行
string SiteCollectionOwner = ElevatedsiteColl.Owner.Name;
}
}
});
这种方式的话,代码就以“username@moss.com ”的权限来运行。