如何在C#/ .NET中找到本地机器的FQDN?

84 c# localhost fqdn

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

Mik*_*scu 135

注意:此解决方案仅适用于面向.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
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

最重要的是要注意的是我给出的代码不等同于以下代码:

Dns.GetHostEntry("LocalHost").HostName
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此,最终由每个用户决定哪种方法更适合他们的应用,具体取决于他们需要什么样的结果.但要说这个答案错误,因为不够简洁就是肤浅的.

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

  • 如果domainName为空,则返回`hostName.应该有一个`!String.isNullorEmpty(domainName)`检查 (5认同)
  • 使用`Dns.GetHostEntry(“ LocalHost”)。HostName`,我总是得到带有主域后缀的主机名(不是netbios)。这不取决于计算机是域的一部分,是否可以访问DNS服务器还是已连接netzwork。可能我不明白您的解释,但结果是我所期望的。(计算机:W2008R2; .net 4.0; netbiosname:TESTNAME-VERYLO主机名:TESTNAME-VERYLONG) (2认同)
  • 对于以与域名相同的字母结尾的主机名(例如域 OST 中的主机 MYHOST),`EndsWith` 检查被破坏,应该是 `EndsWith("." + domainName)` (2认同)

Mat*_*t Z 63

稍微简化了Miky D的代码

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

  • 与Micky D的代码不同,如果机器不是域的成员,则返回带有附加的fullstop的主机名. (4认同)

Sam*_*Sam 27

本文将对此进行介绍.这种技术比接受的答案更简短,可能比下一个最多投票的答案更可靠.请注意,据我所知,这使用NetBIOS名称,因此它应该适合Internet使用.

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName
Run Code Online (Sandbox Code Playgroud)

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案!但是最好不要像这样传递一个空字符串,例如:Dns.GetHostEntry(“ LocalHost”)。HostName` (3认同)

hal*_*000 17

这是它在PowerShell中的原因:

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


小智 15

而对于Framework 1.1来说就像这样简单:

System.Net.Dns.GetHostByName("localhost").HostName
Run Code Online (Sandbox Code Playgroud)

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


UT-*_*-05 8

您可以尝试以下方法:

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
Run Code Online (Sandbox Code Playgroud)

这个shoud给你当前本地机器的FQDN(或者你可以指定任何主机).


Bos*_*sco 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);
}
Run Code Online (Sandbox Code Playgroud)