【问题标题】:Getting users from another AD Domain using PrincipalContext使用 PrincipalContext 从另一个 AD 域获取用户
【发布时间】:2015-06-17 21:41:30
【问题描述】:

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

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

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

域 1 用户:TestUser1、TestUser2

域 2 用户:TestUser3、TestUser4、TestUser5

TestGroup 用户:TestUser1、TestUser2、TestUser3、TestUser5

以下可能只会返回 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;
         }
     }
}

返回用户名变量时,我只会看到来自 Domain1 的用户。我在这里遗漏了什么吗? 我的 IIS 服务器位于 Domain1.corp.com

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

get-adgroupmember "TestGroup" -recursive

参考:https://stackoverflow.com/a/7073023/326315

【问题讨论】:

    标签: c# asp.net active-directory asp.net-mvc-5 active-directory-group


    【解决方案1】:

    您需要为组使用底层System.DirectoryServices.DirectoryEntry

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

    (注意:根据MSDNGetUnderlyingObject() 将返回一个DirectoryEntry,即使返回类型是object。)

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      相关资源
      最近更新 更多