.NET_STAR

打造技术团队,愿与您共同开创事业!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::
 

1、sharepoint 一个有用的方法SPSecurity.RunWithElevatedPrivileges(delegate(){})    

 今天开发的过程中用到在MOSS网站上去访问域控上的用户信息,这个我是利用LDAP协议来实现的其中用的了一个DirectoryEntry这个类(这个类是引自system.directoryseverices这个程序集的。)实例化一个DirectoryEntry的对象后调用其中的主法来实现的,(参考:http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry_members(VS.80).aspx

实例化事例代码段:

DirectoryEntry bjDE = new DirectoryEntry (“http://www.cnblogs.com/lmjob/admin/ldap://hostname/");// 当然DirectoryEntry 还有其它的构造函数,我这里只调用了一个参数的构造函数

OK,实例化之后就可以调用其相应方法了,这个参考上面提供的网址。当我把程序入到MOSS网站上的时,会报意外错误,但在我本地开发的机器上没有任何问题包括在虚机上。

  经过一阵的的寻觅和请教发现原来是,放到MOSS上之后,当前登陆用户的权限不足进行这个域控的操作。

解决办法:

把这与的这段代码包在

SPSecurity.RunWithElevatedPrivileges(delegate(){})   中即可。

如:

SPSecurity.RunWithElevatedPrivileges(delegate()

{

 // 此处显示的是要在提升权限的情况下运行的代码。ITPUB个人空间6e5a}jCV
  // 该代码段在 SHAREPOINT/SYSTEM 帐户下运行。

})  ;  

另外还一点值得注意:SPSecurity.RunWithElevatedPrivileges可以提升代码的运行权限,实现模拟管理员身份的功能。

在RunWithElevatedPrivileges中不要使用SPContext.Current.Web,SPContext.Current.Site,SPControl.GetContextWeb(HttpContext.Current)之类的根据当前上下文得到当前的Web或者Site,根据这些方法得到的所有对象(包括从根据这些对象得到的List,ListItem等等对象)都是以当前网站登录用户权限运作的,即使是在RunWithElevatedPrivileges其运作权限也不会是管理员。

所以,如果要真正让在RunWithElevatedPrivileges中的代码以管理员权限正常运作的话,必须重新初始化相应的对象,比如:

SPSecurity.RunWithElevatedPrivileges(delegate()ITPUB个人空间@Y8K4y~$Y$a f5M
{
+TC?3s+Uyy0    using (SPSite mySite = new SPSite(SPContext.Current.Site.Url))
2Zn@$D#P"Z[ Y0    {ITPUB个人空间C4xR_(f2CD
        Response.Write(mySite.RootWeb.CurrentUser.LoginName);
h^F*m"[j0    }ITPUB个人空间kdb2uy&q
});以上mySite.RootWeb.CurrentUser.LoginName返回的是管理员的登录帐号。但是如果按之前所说使用SPContext:SPSecurity.RunWithElevatedPrivileges(delegate()
liG Oa0{ITPUB个人空间iB#@#|'R F,C.u
     Response.Write(SPContext.Current.Web.CurrentUser.LoginName);
8f\-i/tLc%q0});这时候即使在提升权限的范围内运行,得到的也是当前网站登录帐户名,而不是管理员登录帐号

posted on 2010-01-26 14:46  雷明  阅读(331)  评论(0编辑  收藏  举报