【问题标题】:Translating NETBIOS domain into a FQDN (Fully Qualified Domain Name)将 NETBIOS 域转换为 FQDN(完全限定域名)
【发布时间】:2010-09-20 17:12:55
【问题描述】:

简而言之 - 如何将 NETBIOS 域转换为 FQDN?

详情: 假设我在域 A 中,并且我有域 B 的用户凭据,它与域 A 有信任关系(我可以验证凭据)。 当我只有来自该域的一些经过身份验证的用户的凭据(包括 netbios 域名)时,如何获取域 B 的 FQDN?

我使用 C# 进行编码,但也欢迎使用 COM/WMI/Win32 解决方案。

【问题讨论】:

    标签: c# active-directory dns netbios fqdn


    【解决方案1】:

    这可能不是最佳的,但看起来您可以执行 NetBIOS 名称查询以获取 IP 地址,然后执行反向 DNS 查找以从中获取 FQDN...

    http://www.protocolbase.net/protocols/protocol_NBNS.php

    (反向DNS步骤很容易查到)

    【讨论】:

    • WINS 与 DNS 完全相同,但用于 NetBIOS 名称而不是域名。因此,您必须从一种名称方案转换为另一种名称方案。他们共享的唯一信息是 IP,所以这也是我所知道的唯一一个好的过程。
    【解决方案2】:

    您对其他域有什么样的访问权限?您要针对其他域中的哪个服务器/服务进行身份验证?

    您是否对另一个域中的域服务器具有 IP 访问权限?如果是这样,那么您可以进行如下调用:

    DirectoryEntry rootDSE = new DirectoryEntry("LDAP://10.11.12.13/rootDSE", @"DOMAIN\Username", "Password");
    Console.WriteLine(rootDSE.Properties["defaultNamingContext"].Value);
    

    (将 10.11.12.13 替换为域服务器地址)。

    您将收到代表 FQDN 的“DC=company,DC=org”形式的回复(只需通过删除 DC 部分并插入点来重建它)

    【讨论】:

      【解决方案3】:

      使用 WinNT 提供程序绑定到域并过滤所有用户帐户。开始枚举用户帐户。

      如果用户帐户 sAMAccount 名称不包含字符串“duplicate”,则退出循环并使用 NameTranslate 对象查找帐户的 LDAP 名称。

      LDAP 名称的一部分是域 FQDN。

      嘿,这是一种软糖,但它的作用就像一个魅力。

      【讨论】:

        【解决方案4】:

        vanara collection of win32 libraries 可以用于此。 NetApi32.dll 中的DsGetDcName API 提供了从 NetBIOS 域名到 dns 域名的转换(作为副作用)。

        进入VS进入nuget包管理器,获取Vanara.PInvoke.NetApi32包。

        这两种方法将 NetBIOS 名称转换为 dns 名称,反之亦然。

        public static string ResolveNetBIOSDomainNameToDnsName(string netBIOSName)
        {
            Vanara.PInvoke.NetApi32.DOMAIN_CONTROLLER_INFO domainDcInfo = 
                    Vanara.PInvoke.NetApi32.DsGetDcName(Vanara.PInvoke.NetApi32.DsGetDcNameFlags.DS_RETURN_DNS_NAME | Vanara.PInvoke.NetApi32.DsGetDcNameFlags.DS_IS_FLAT_NAME, null, netBIOSName);
            return domainDcInfo.DomainName;
        }
        
        public static string ResolveDNSDomainNameToNetBIOSName(string dnsName)
        {
            Vanara.PInvoke.NetApi32.DOMAIN_CONTROLLER_INFO domainDcInfo = 
                    Vanara.PInvoke.NetApi32.DsGetDcName(Vanara.PInvoke.NetApi32.DsGetDcNameFlags.DS_RETURN_FLAT_NAME | Vanara.PInvoke.NetApi32.DsGetDcNameFlags.DS_IS_DNS_NAME, null, dnsName);
            return domainDcInfo.DomainName;
        }
        

        【讨论】: