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()
{
// 此处显示的是要在提升权限的情况下运行的代码。
// 该代码段在 SHAREPOINT/SYSTEM 帐户下运行。
}) ;
另外还一点值得注意:SPSecurity.RunWithElevatedPrivileges可以提升代码的运行权限,实现模拟管理员身份的功能。
在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);
});这时候即使在提升权限的范围内运行,得到的也是当前网站登录帐户名,而不是管理员登录帐号