如何在C#/。NET中查找本地计算机的FQDN?


Answers:


140

注意:此解决方案仅在针对.NET 2.0(及更高版本)框架时才有效。

using System;
using System.Net;
using System.Net.NetworkInformation;
//...

public static string GetFQDN()
{
    string domainName = IPGlobalProperties.GetIPGlobalProperties().DomainName;
    string hostName = Dns.GetHostName();

    domainName = "." + domainName;
    if(!hostName.EndsWith(domainName))  // if hostname does not already include domain name
    {
        hostName += domainName;   // add the domain name part
    }

    return hostName;                    // return the fully qualified name
}

更新

由于很多人都评论说“ Sam的答案”更为简洁,所以我决定在答案中添加一些评论。

需要注意的最重要的事情是,我提供的代码不等同于以下代码:

Dns.GetHostEntry("LocalHost").HostName

在一般情况下,当机器联网并且是域的一部分时,两种方法通常会产生相同的结果,而在其他情况下,结果将有所不同。

当计算机不属于域时,输出将不同的情况。在这种情况下,Dns.GetHostEntry("LocalHost").HostName将返回,localhost而上述GetFQDN()方法将返回主机的NETBIOS名称。

当查找计算机FQDN的目的是记录信息或生成报告时,此区别很重要。大多数时候,我在日志或报告中使用此方法,然后将这些信息用于将信息映射回特定计算机。如果机器未联网,则localhost标识符将无用,而名称会提供所需的信息。

因此,最终取决于每个用户哪种结果更适合他们的应用程序。但是,说这个答案不够简洁是错误的,充其量只是表面现象。

请参见输出不同的示例:http : //ideone.com/q4S4I0


2
使用“ Dns.GetHostEntry("LocalHost").HostName我”总是得到带有主域后缀的主机名(而不是netbios)。这不取决于计算机是域的一部分,是否可以访问DNS服务器还是已连接netzwork。可能我不明白您的解释,但结果是我所期望的。(计算机:W2008R2; .net 4.0; netbiosname:TESTNAME-VERYLO主机名:TESTNAME-VERYLONG)
marsh-wiggle

为什么在上一行中使用Dns.GetHostName()for hostName而不是使用已有对象的HostName属性IPGlobalProperties
Xharlie 2014年

@Xharlie,因为IPGlobalPropertieshostname属性返回NetBIOS名称,而Dns.GetHostName()返回DNS主机名称。
Mike Dinescu 2014年

2
EndsWith对于以与域名相同的字母结尾的主机名(例如,在域OST中的主机MYHOST)结尾的检查被打断了,应该是EndsWith("." + domainName)
user3391859 2015年

6
如果domainName为空,则返回hostName.。应该有一张!String.isNullorEmpty(domainName)支票
RodgerTheGreat

63

Miky D的代码略有简化

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }

4
与Micky D的代码不同,如果计算机不是域的成员,则此命令将返回带有附加句号的主机名。
Bosco

1
此外,这使用NetBIOS名称而不是DNS主机名。我相信NetBIOS名称仅适用于LAN。
2013年

也许.Trim(".")在最后一行添加a 以摆脱。如果存在。
大卫·德·埃·弗雷塔斯

28

本文涵盖了这一点。该技术比接受的答案更简短,并且可能比下一个投票最多的答案更可靠。请注意,据我了解,这使用NetBIOS名称,因此它应该适合Internet使用。

.NET 2.0以上

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0-1.1

Dns.GetHostByName("LocalHost").HostName

@DexterLegaspi-Sam的答案是一个很好的答案(我什至自己都赞成),但这不等于我的答案,也不一定更好。请查看我更新后的答案以获取详细信息。
2014年

@MikeDinescu的问题是如何获取FQDN,这表明该计算机位于网络中并且是域的一部分。公认的答案可以胜任工作,但Sam的答案更为“精确”(因为缺少更好的用词)
Dexter Legaspi 2014年

3
这是正确的答案!但最好不要Dns.GetHostEntry("LocalHost").HostName像这样传递一个空字符串:Dns.GetHostEntry("").HostName
paulgutten

17

这在PowerShell中非常有用:

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName

15

而对于Framework 1.1来说,就是这么简单:

System.Net.Dns.GetHostByName("localhost").HostName

然后删除计算机的NETBIOS名称以仅检索domainName


在这里,2013年GetHostByName("localhost")已过时。VS 2010建议我改用GetHostEntry("localhost")它,效果很好。
piedar

@piedar,您可能会错过有关.NET 1.1的信息。
2014年

我想在此答案中添加更新的信息,因为它是最简单的,因此也是我的最爱。我可能滚动得不够远,看不到您的答案,这确实使我的评论不必要了。
piedar 2014年

8

您可以尝试以下操作:

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

这应该为您提供当前本地计算机的FQDN(或者您可以指定任何主机)。


5

Matt Z的回答略有改进,因此如果计算机不是域成员,则不会返回尾随句号:

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}

请注意,我认为这使用NetBIOS主机名,因此它可能不适合Internet使用。
2013年

2

使用此选项作为组合主机名和域名以生成报告的选项之一,添加了通用文本以在未捕获域名时进行填写,这是客户的要求之一。

我使用C#5.0,.Net 4.5.1进行了测试

private static string GetHostnameAndDomainName()
{
       // if No domain name return a generic string           
       string currentDomainName = IPGlobalProperties.GetIPGlobalProperties().DomainName ?? "nodomainname";
       string hostName = Dns.GetHostName();

    // check if current hostname does not contain domain name
    if (!hostName.Contains(currentDomainName))
    {
        hostName = hostName + "." + currentDomainName;
    }
    return hostName.ToLower();  // Return combined hostname and domain in lowercase
} 

使用Miky Dinescu解决方案的想法构建。


1

我们已实现建议的结果以这种方式使用:

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

但是,事实证明,当计算机名称超过15个字符并使用NetBios名称时,此方法将无法正常工作。Environment.MachineName仅返回部分名称,解析主机名返回相同的计算机名称。

经过研究,我们找到了解决此问题的解决方案:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName

这解决了所有问题,包括计算机名称。


如果您有一台计算机,该计算机已被用户命名,但其中包含的字符不是az,0-9,'。','-',则这将引发异常,并且建议的其他大多数解决方案也会失败。因此,如果您在亚洲或类似国家/地区拥有用户,则可以预期会出现问题。GetHostName会将那些字符替换为“?”。这就是为什么我更喜欢显示实际计算机名称的GetHostByName(“ localhost”)。HostName的原因。
葛兰

0

我使用了这种方法:

private static string GetLocalhostFQDN()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}

0

我测试过的所有答案都没有提供我一直在寻找的DNS后缀。这是我想出的。

public static string GetFqdn()
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    var ipprops = networkInterfaces.First().GetIPProperties();
    var suffix = ipprops.DnsSuffix;
    return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}

-9

如果您想整理一下并处理异常,请尝试以下操作:

public static string GetLocalhostFQDN()
        {
            string domainName = string.Empty;
            try
            {
                domainName = NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
            }
            catch
            {
            }
            string fqdn = "localhost";
            try
            {
                fqdn = System.Net.Dns.GetHostName();
                if (!string.IsNullOrEmpty(domainName))
                {
                    if (!fqdn.ToLowerInvariant().EndsWith("." + domainName.ToLowerInvariant()))
                    {
                        fqdn += "." + domainName;
                    }
                }
            }
            catch
            {
            }
            return fqdn;
        }


您认为catch本身可以处理异常!
Saher Ahwal

不,我认为您要如何处理异常是您需要自己决定的事情。如果您无法找回域名,您将如何处理呢?
罗杰·威尔考克斯

4
记录错误报告并警告用户出现问题,而不是向客户端代码提供错误的信息。
dahvyd 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.