今天做个小功能时,遇到个小问题。当用户在listA下添加一个item时,要对另外一个listB里的数据进行更新,而该用户对于listB只有读取权限,怎么办呢
于是翻书看看了,才发现原来MOSS有中模拟管理员权限的方法〔SPSecurity.RunWithElevatedPrivileges(delegate())},这样一来问题就解决了
SPSecurity.RunWithElevatedPrivileges(delegate() { // implementation details omitted });
可以提升代码的运行权限,实现模拟管理员身份的功能。
在RunWithElevatedPrivileges中不要使用SPContext.Current.Web,SPContext.Current.Site,SPControl.GetContextWeb(HttpContext.Current)之类的根据当前上下文得到当前的Web或者Site,根据这些方法得到的所有对象(包括从根据这些对象得到的List,ListItem等等对象)都是以当前网站登录用户权限运作的,即使是在RunWithElevatedPrivileges其运作权限也不会是管理员。
所以,如果要真正让在RunWithElevatedPrivileges中的代码以管理员权限正常运作的话,必须重新初始化相应的对象,比如:
SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite mySite = new SPSite(SPContext.Current.Site.Url)) { Response.Write(mySite.RootWeb.CurrentUser.LoginName); } });
以上mySite.RootWeb.CurrentUser.LoginName返回的是管理员的登录帐号。
但是如果按之前所说使用SPContext:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
Response.Write(SPContext.Current.Web.CurrentUser.LoginName);
});
这时候即使在提升权限的范围内运行,得到的也是当前网站登录帐户名,而不是管理员登录帐号