92

如何在 C# 中获取本地计算机的 FQDN?

4

13 回答 13

146

注意:此解决方案仅适用于 .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
}

更新

由于很多人评论说山姆的答案更简洁,我决定在答案中添加一些评论。

最需要注意的是,我给出的代码并不等同于下面的代码:

Dns.GetHostEntry("LocalHost").HostName

虽然在机器联网并且属于域的一般情况下,这两种方法通常会产生相同的结果,但在其他情况下,结果会有所不同。

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

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

因此,最终取决于每个用户,哪种方法更适合他们的应用程序,具体取决于他们需要的结果。但是说这个答案不够简洁是错误的,充其量是肤浅的。

查看输出不同的示例:http: //ideone.com/q4S4I0

于 2009-04-29T23:12:03.963 回答
63

Miky D 代码的轻微简化

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }
于 2009-05-18T20:58:11.267 回答
31

本文对此进行了介绍。这种技术比公认的答案更简短,并且可能比下一个投票最多的答案更可靠。请注意,据我了解,这使用 NetBIOS 名称,因此它应该适合 Internet 使用。

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName
于 2013-06-13T05:14:35.623 回答
17

这是在PowerShell中,为了它:

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
于 2009-09-14T19:26:53.050 回答
15

对于 Framework 1.1,就这么简单:

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

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

于 2010-05-14T10:29:33.070 回答
9

您可以尝试以下方法:

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

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

于 2014-01-24T20:12:11.893 回答
5

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

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
于 2013-02-12T09:15:52.950 回答
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 解决方案的想法构建。

于 2014-05-16T17:04:08.397 回答
1

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

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

然而,事实证明,当计算机名称超过 15 个字符并使用 NetBios 名称时,这不起作用。Environment.MachineName 仅返回部分名称,解析主机名返回相同的计算机名称。

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

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

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

于 2019-01-18T12:37:39.917 回答
1

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

public static string GetFqdn()
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    var ipprops = networkInterfaces.First().GetIPProperties();
    var suffix = ipprops.DnsSuffix;
    return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
于 2019-12-23T18:22:08.520 回答
0

我用过这种方法:

private static string GetLocalhostFQDN()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}
于 2019-12-04T12:14:49.907 回答
0

我收集的处理 FQ 主机名/主机名/NetBIOS 机器名/域名周围所有情况的方法

    /// <summary>
    /// Get the full qualified hostname
    /// </summary>
    /// <param name="throwOnMissingDomainName"></param>
    /// <returns></returns>
    public static string GetMachineFQHostName(bool throwOnMissingDomainName = false)
    {
        string domainName = GetMachineFQDomainName();
        string hostName = GetMachineHostName();

        if (string.IsNullOrEmpty(domainName) && throwOnMissingDomainName) throw new Exception($"Missing domain name on machine: { hostName }");
        else if (string.IsNullOrEmpty(domainName)) return hostName;
        //<----------

        return $"{ hostName }.{ domainName }";
    }


    /// <summary>
    /// Get the NetBIOS name of the local machine
    /// </summary>
    /// <returns></returns>
    public static string GetMachineName()
    {
        return Environment.MachineName;
    }

    /// <summary>
    /// Get the Hostname from the local machine which differs from the NetBIOS name when 
    /// longer than 15 characters
    /// </summary>
    /// <returns></returns>
    public static string GetMachineHostName()
    {
        /// I have been told that GetHostName() may return the FQName. Never seen that, but better safe than sorry ....
        string hostNameRaw = System.Net.Dns.GetHostName();
        return hostNameRaw.Split('.')[0];
    }

    /// <summary>
    /// Check if hostname and NetBIOS name are equal
    /// </summary>
    /// <returns></returns>
    public static bool AreHostNameAndNetBIOSNameEqual()
    {
        return GetMachineHostName().Equals(GetMachineName(), StringComparison.OrdinalIgnoreCase);
    }

    /// <summary>
    /// Get the domain name without the hostname
    /// </summary>
    /// <returns></returns>
    public static string GetMachineFQDomainName()
    {
        return IPGlobalProperties.GetIPGlobalProperties().DomainName;
    }
于 2020-12-02T06:48:47.110 回答
-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;
        }
于 2011-05-15T23:42:47.547 回答