【问题标题】:Obtain specific user (not current user) domain name from Active directory从 Active Directory 中获取特定用户(不是当前用户)的域名
【发布时间】:2011-08-01 11:17:04
【问题描述】:

虽然我意识到网上有很多与此问题相关的材料,但针对此特定问题的材料似乎并不多。

我希望在 C# 中查询 Active Directory,不仅可以获取用户名,还可以获取用户的域名。我不是在寻找当前用户或当前会话的域名。

这样做的原因是许多用户将来自多个域,并且不会与通过 UI 操作用户凭据的管理员同名

所以当管理员添加用户时,我需要检查用户的域名并输入用户名之前的名称,例如域\用户名 由于添加的用户的域名不一定与之前添加的用户相同。

【问题讨论】:

  • 我不太清楚您要查询什么以及需要返回什么。当管理员添加一个他不知道他将用户添加到哪个域的用户时,为什么会这样?
  • 嗨,谢谢你的提问。
  • 我希望返回管理员添加的特定用户的域。管理员将/应该知道用户的域,但是这是通过自动添加域名和用户名来防止人为错误和时间。谢谢

标签: c# asp.net .net active-directory


【解决方案1】:

因此,作为 userPrincipalName 中域的第一个组成部分的域的 netbios 名称(例如,brian@contoso.com 是 CONTOSO\brian)纯属巧合。完全没有理由他们必须在 AD 中匹配。

获取用户域的 netBIOS 名称的位置来自该域的 crossRef 对象。为此,您需要获取用户的 distinctName 的域部分(即以 DC= 开头的字符串部分),然后使用如下过滤器在配置 NC 中搜索匹配的 crossRef: (&(objectClass=交叉引用)(ncName=))。然后,您可以检查 nETBIOSName 属性。

要获取配置 NC 的 DN 来根您的搜索,您可以向 LDAP://RootDSE 询问 configurationNamingContext 属性。

【讨论】:

    【解决方案2】:

    一个可能的解决方案是使用 LDAP。这将让您连接和查询不同的域。全名存储为用户主体,例如 username@domainname.com

    尽管对于给定的域名,您仍然需要知道要连接到哪棵树。此外,除非域在森林中,否则如果您仅根据用户名进行搜索,则可能会得到重复的域用户名。

    如果域位于林中,则有一个快捷方式,您可以使用全局编录在林根中进行搜索。然后,您将在每个子域中进行搜索。不过,这可能需要一段时间,具体取决于要搜索的树的大小。

    编辑

    这些是我使用的一些用于检查 LDAP 的代码片段。您应该能够将它们组合成有用的东西。

    LdapConnection connection = new LdapConnection(new LdapDirectoryIdentifier(_Parser.Host, _Parser.Port));
    connection.Bind(new System.Net.NetworkCredential(_Parser.Username, _Parser.Password));
    

    x--- 剪辑

    request = new SearchRequest();
    request.Filter = query;
    request.Scope = SearchScope.Subtree;
    request.DistinguishedName = _Parser.SearchBase;
    
    response = (SearchResponse)connection2.SendRequest(request);
    

    响应包含一组结果,然后您可以枚举以找到您感兴趣的条目。

    LDAP 查询使用反向波兰表示法,我认为您想要的是 (samaccountname=<your value here>) 替换为您要查找的用户名。您不需要引用该值。

    _Parser.SearchBase 替换为您要开始搜索的对象的dn 字符串。这可能是您的域根,例如 dc=somedomain,dc=com 如果您的域是 somedomain.com host 应该是您要连接的 AD 服务器的名称。使用 3268 作为端口,因为它是全局目录,因为它是只读的,所以速度更快并且具有所有分区。将您用于连接的用户名指定为 username@somedomain.com。

    查找名为 userprincipalname 的属性。 msdn 文档应该可以帮助您了解如何读取结果对象。

    西蒙

    【讨论】:

    • 嗨@Simon,感谢您的回复。你的回答对我来说很有意义,但只是为了提供一些额外的信息,我正在使用 MembershipUserCollection 中的 getAllUsers() 方法。您的解决方案是否仍适用于此?当通过管理屏幕添加用户时,我们要检查用户名的域并将其与用户名和反斜杠连接,例如域 + \ + 用户名。谢谢!
    • 抱歉,如果其中有任何含糊之处,MembershipUserCollection 对象来自 System.Web.Security.MembershipUserCollection 类。再次感谢。
    • 另外,您提到了一个用户主体 (username@domainname.com) 有没有办法通过 LDAP 返回这个值?如果我能得到那个,我可以从那里解析出域名吗?谢谢。
    • userprincipalname 是 LDAP 属性。它可能与您的域名匹配,也可能不匹配。域\用户名格式在用户和计算机控制面板中被称为旧格式。根据您的设置,您可能需要也可能不需要进行一些额外的查找来转换为 NTLM 域
    • 我会做一个自定义的 LDAP 检查而不是使用 getallusers,因为这可能会返回很多对象。
    猜你喜欢
    • 1970-01-01
    • 2019-12-23
    • 2017-08-05
    • 2011-05-14
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多