4

我有一个让我有点抓狂的问题:使用 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;
                }
            });

这在“new UserProfileManager”行上仍然失败,“您必须具有管理用户配置文件管理员权限才能使用管理员模式”例外。

就我用户而言,RunWithElevatedPrivileges 恢复为 AppPool 身份。WindowsIdentity.GetCurrent().Name 返回“NT AUTHORITY\network service”,并且我已授予该帐户“管理用户配置文件”权限 - 不走运。

site.RootWeb.CurrentUser.LoginName 为在 RunWithElevatedPrivileges 中创建的站点返回 SHAREPOINT\system,该站点不是有效的 Windows 帐户。

有没有办法做到这一点?我不想给所有用户“管理用户配置文件”的权限,但我只想从用户配置文件(部门、国家、直接报告)中获取一些数据。有任何想法吗?

4

4 回答 4

4

需要设置的权限实际上是在共享服务提供者中找到的。

  1. 导航到中央管理
  2. 导航到共享服务提供商
  3. 用户配置文件和我的站点下导航到个性化服务权限。
  4. 如果该帐户尚不存在,请添加运行您的站点 App Domain 的帐户。
  5. 授予该用户管理用户配置文件权限。

我注意到您正在网络服务帐户下运行应用程序池。我在我的网站上实现了相同的功能;但是,应用程序池托管在 Windows 帐户下。但是,我不确定为什么这会有所作为。

于 2008-09-17T13:21:41.613 回答
2

我实际上有两种方法可以做到这一点:

  1. 将使用 UserProfileManager 的代码放在 Web 服务层后面。Web 服务应使用有权访问用户配置文件服务的应用程序池身份。
  2. 使用以下文章中描述的模拟技术:http: //www.dotnetjunkies.com/WebLog/victorv/archive/2005/06/30/128890.aspx
于 2008-10-02T09:57:40.353 回答
2

感谢您的回答。一个警告:如果您将应用程序池作为“网络服务”而不是域帐户运行,那么您就完蛋了。

但是话又说回来,无论如何建议使用域帐户(在测试服务器上我使用了网络服务,但将其更改为域帐户后它可以工作)。

于 2008-10-02T11:59:52.743 回答
1

这是答案。它是一个愚蠢的 Microsoft 错误,并且有一个修补程序。我现在下载来测试一下。

http://support.microsoft.com/kb/952294/en-us

于 2009-02-04T02:06:22.057 回答