使用 PrincipalContext 从另一个 AD 域获取用户

Getting users from another AD Domain using PrincipalContext

如何从包含来自不同域的用户的 AD 组中获取用户。

例如,我的活动目录中有 2 个域,Domain1.corp.comDomain2.corp.com

我有一个名为 TestGroup 的 AD 组,其中包含来自两个域的用户。

Domain1 users: TestUser1, TestUser2

Domain2 users: TestUser3, TestUser4, TestUser5

TestGroup users: TestUser1, TestUser2, TestUser3, TestUser5

以下可能 return 仅限 Domain1 用户。

string domainname = "Domain1.corp.com:3268";
string usernames = String.Empty;
using (var p_context = new PrincipalContext(ContextType.Domain, domainname))
{
     using (var group = GroupPrincipal.FindByIdentity(context, "TestGroup"))
     {
         var users = group.GetMembers(false);
         foreach (var user in users)
         {
             username = username + ", " + user.SamAccountName;
         }
     }
}

当 return 输入用户名变量时,我只能看到来自 Domain1.Am 的用户 我在这里遗漏了什么? 我的 IIS 服务器位于 Domain1.corp.com

我通过 运行 一个 powershell 脚本验证了服务器可以访问另一个域,该脚本 returned 位于两个域中的用户。

get-adgroupmember "TestGroup" -recursive

参考:

您需要为群组使用基础System.DirectoryServices.DirectoryEntry

var groupEntry = (DirectoryEntry)group.GetUnderlyingObject();

(注意:根据 MSDN GetUnderlyingObject() 将 return 一个 DirectoryEntry,即使 return 类型是 object。)

从那里您可以获得成员的专有名称:

var memberDistinguishedNames = groupEntry.Properties["member"].Cast<string>();

来自其他域的用户是外部安全主体,因此专有名称将采用 CN={SecurityIdentifier},CN=ForeignSecurityPrincipals 形式。您可以提取安全标识符并在另一个 domain/s 上搜索用户,以获取他们的其余详细信息。不幸的是,这确实意味着您需要连接到两个域,这可能很慢。