【问题标题】:Resolve domain address in/for Active Directory [.net]为 Active Directory [.net] 解析域地址
【发布时间】:2026-02-04 12:15:01
【问题描述】:

有没有一种简单的方法来解析 Active Directory 中域名的 Active Directory 路径?

例如您的用户帐户可能是 SITE\Username 或 DEPARTMENT\Username,但域 SITE 的实际路径可能是 site.company.com 或 DEPARTMENT 可能是 dep.company.com 等

我正在尝试将 DEPARTMENT 转换为 DC=dep,DC=company,DC=com 等以便在 Active Directory 中正确搜索...

【问题讨论】:

    标签: active-directory dns


    【解决方案1】:

    您可能拥有的是一家拥有一个 forrest (company.com) 和几个子域(在您的情况下为 SITE 和 DEPARTMENT)的公司。 SITE 和 DEPARTMENT 位是域的 NetBIOS 表示。它们与相应的 DNS 名称不同并不常见,但这是可能的。请确保我们不是在谈论 OU:s 和“物理”Active Directory 站点。

    假设上述情况,这里有几个选项:

    以下假设您的应用程序在具有“forrest 范围的读取访问权限”(访问不同域的能力)的帐户下运行:

    using System.DirectoryServices.ActiveDirectory;
    
    // ...
    
    DirectoryContext directoryContext
        = new DirectoryContext(DirectoryContextType.Domain, "DEPARTMENT");
    Domain domain = Domain.GetDomain(directoryContext);
    String domainName = domain.Name;
    String domainComponent = "DC=" + domainName.Replace(".", ",DC=");
    Console.WriteLine(domainComponent);
    

    (我还没有找到将 domain.company.com 转换为 DC=domain,DC=company,DC=com 的“System.DirectoryServices-built-in”方法,但上面的简单字符串操作应该可以解决问题。 )

    如果您使用的是非 forrest 范围的帐户(或者如果 DEPARTMENT 和 SITE 不是同一个 forrest 中的域,而是各自独立的 forrest),那么您必须维护一个用户名和密码列表以使用取决于“DEPARTMENT”或“SITE”字符串:

    // if(domainNetBios == "DEPARMENT")...
    DirectoryContext directoryContext
        = new DirectoryContext(DirectoryContextType.Domain,
        "DEPARTMENT",
        "UserInDEPARTMENT",
        "PassForUserInDEPARTMENT");
    

    如果您不愿意绑定到不同的 forrest/域来获取域名/组件,您可以尝试以下方式:

    IPAddress[] addresses = Dns.GetHostAddresses("DEPARTMENT");
    IPHostEntry host = Dns.GetHostEntry(addresses[0]);
    Int32 dotIndex = host.HostName.IndexOf('.');
    String domain =
        host.HostName.Substring(dotIndex + 1, host.HostName.Length - dotIndex - 1);
    Console.WriteLine(domain);
    

    但以上假设 NETBios-name 与 DNS-name 的第一部分相同,并且 DNS 解析工作正常。我们在上面所做的是查询域控制器列表,然后从 DNS 名称中删除主机名。不是一个特别干净的选择...

    【讨论】:

    • 太棒了!谢谢。一些注意事项...查找位于更远的域需要更长的时间...我尝试使用 GlobalCatalog 但我们的一些域必须是 DNS 表示...实际上不在 AD 中...
    • 另外,我在其他部分使用了完全相同的 replace(".",",DC=")...到目前为止工作正常!