6

我正在尝试使用 System.DirectoryServices.AccountManagment 确定用户是否是给定组的成员。

  • 我在 64 位系统上的 SharePoint 2007 中的 SharePoint WebPart 中执行此操作。
  • 项目面向 .NET 3.5
  • 在 web.config 中启用了模拟。
  • 有问题的 IIS 站点正在使用将域用户配置为身份的 IIS 应用程序池。

我可以这样实例化 a PrincipalContext

PrincipalContext pc = new PrincipalContext(ContextType.Domain)

接下来,我尝试获取一个主体:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
   GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\somegroup");
   // snip: exception thrown by line above.
}

以上和UserPrincipal.FindByIdentity用户 SAM 都会抛出DirectoryServicesCOMException:“登录失败:未知用户名或密码错误”

我已经尝试将完整的 SAMAccountName 传递给FindByIdentity(以 MYDOMAIN\username 的形式)或者只是用户名,而行为没有改变。HostingEnvironment.Impersonate我已经尝试使用and方法使用其他凭据执行代码,SPSecurity.RunWithElevatedPrivileges并且也遇到了相同的结果。

我还尝试使用适当的域名实例化我的上下文:

Principal Context pc = new PrincipalContext(ContextType.Domain, "MYDOMAIN");

这会引发PrincipalServerDownException:“无法联系服务器。”

我正在一个合理强化的服务器上工作。我没有锁定系统,所以我不确定对它做了什么。如果有凭据我需要分配给我的池身份的用户或域安全策略以使它们起作用,我可以相应地配置域。是否有任何设置会阻止我的代码运行?我在代码本身中遗漏了什么吗?这在 SharePoint Web 中是不可能的吗?

编辑:经过进一步测试,我的代码在针对 .NET 4.0 的控制台应用程序中测试时可以正常运行。我针对的是不同的框架,因为出于某种原因,在针对 .NET 3.5 时,我在控制台应用程序中没有可用的 AccountManagement。

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, "MYDOMAIN\joe.user"))
using (GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\user group"))
{
   if (adUser.IsMemberOf(adGroup))
   {
       Console.WriteLine("User is a member!");
   }
   else
   {
       Console.WriteLine("User is NOT a member.");
   }
}

我的 SharePoint 环境中可能会禁止执行此功能的哪些变化?

4

1 回答 1

1

我将 IIS 应用程序池使用的帐户添加到管理员组,此问题已解决。

于 2010-05-26T15:34:27.427 回答