没有"管理用户配置文件"权限的Sharepoint UserProfileManager
我有一个让我有点生气的问题:使用UserProfileManager作为非授权用户。
问题:用户没有"管理用户配置文件"权限,但是我仍然想使用UserProfileManager。使用SPSecurity.RunWithElevatedPrivileges的想法似乎不起作用,因为UserProfileManager似乎对SSP进行了授权。
SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(inputWeb.Site.ID)) { ServerContext ctx = ServerContext.GetContext(site); UserProfileManager upm = new UserProfileManager(ctx,true); UserProfile u = upm.GetUserProfile(userLogin); DepartmentName = u["Department"].Value as string; } });
这在"新UserProfileManager"行上仍然失败,并带有"我们必须具有管理用户配置文件的管理员权限才能使用管理员模式"例外。
就我的用户而言,RunWithElevatedPrivileges还原为AppPool身份。 WindowsIdentity.GetCurrent()。Name返回" NT AUTHORITY \ network service",并且我给该帐户"管理用户配置文件"权限没有运气。
site.RootWeb.CurrentUser.LoginName返回在RunWithElevatedPrivileges(不是有效的Windows帐户)中创建的站点的SHAREPOINT \ system。
有没有办法做到这一点?我不想授予所有用户"管理用户个人资料"的权限,但是我只想从用户个人资料(部门,国家/地区,直接报告)中获取一些数据。有任何想法吗?
解决方案
回答
实际上,需要在共享服务提供者中找到需要设置的权限。
- 导航到中央管理
- 导航到共享服务提供商
- 在"用户配置文件"和"我的网站"下,导航到"个性化服务权限"。
- 如果该帐户尚不存在,请添加为其运行App Domain的网站的帐户。
- 授予该用户"管理用户个人资料"权限。
我注意到我们正在网络服务帐户下运行应用程序池。我在自己的网站上实现了相同的功能;但是,应用程序池托管在Windows帐户下。我不知道为什么这会有所作为。
回答
我实际上设法完成了两种方法:
- 将使用UserProfileManager的代码放在Web服务层后面。 Web服务应使用有权访问用户配置文件服务的应用程序池标识。
- 使用下面的文章中描述的模拟技术:http://www.dotnetjunkies.com/WebLog/victorv/archive/2005/06/30/128890.aspx
回答
感谢答案。一个警告:如果我们将应用程序池作为"网络服务"而不是域帐户来运行,那么我们将陷入困境。
但是再一次,建议仍然使用域帐户(在测试服务器上,我使用了网络服务,但是将其更改为域帐户后,它可以工作)。
回答
这就是答案。它是一个愚蠢的Microsoft错误,并且有一个修复程序。我正在下载进行测试。
http://support.microsoft.com/kb/952294/en-us