如何在C#中获取本地计算机的FQDN?
Answers:
注意:此解决方案仅在针对.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
Dns.GetHostName()
for hostName
而不是使用已有对象的HostName
属性IPGlobalProperties
?
IPGlobalProperties
hostname属性返回NetBIOS名称,而Dns.GetHostName()
返回DNS主机名称。
EndsWith
对于以与域名相同的字母结尾的主机名(例如,在域OST中的主机MYHOST)结尾的检查被打断了,应该是EndsWith("." + domainName)
hostName.
。应该有一张!String.isNullorEmpty(domainName)
支票
Miky D的代码略有简化
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
在最后一行添加a 以摆脱。如果存在。
本文涵盖了这一点。该技术比接受的答案更简短,并且可能比下一个投票最多的答案更可靠。请注意,据我了解,这不使用NetBIOS名称,因此它应该适合Internet使用。
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
像这样传递一个空字符串:Dns.GetHostEntry("").HostName
而对于Framework 1.1来说,就是这么简单:
System.Net.Dns.GetHostByName("localhost").HostName
然后删除计算机的NETBIOS名称以仅检索domainName
GetHostByName("localhost")
已过时。VS 2010建议我改用GetHostEntry("localhost")
它,效果很好。
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);
}
使用此选项作为组合主机名和域名以生成报告的选项之一,添加了通用文本以在未捕获域名时进行填写,这是客户的要求之一。
我使用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解决方案的想法构建。
我们已实现建议的结果以这种方式使用:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
但是,事实证明,当计算机名称超过15个字符并使用NetBios名称时,此方法将无法正常工作。Environment.MachineName仅返回部分名称,解析主机名返回相同的计算机名称。
经过研究,我们找到了解决此问题的解决方案:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
这解决了所有问题,包括计算机名称。
我测试过的所有答案都没有提供我一直在寻找的DNS后缀。这是我想出的。
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
如果您想整理一下并处理异常,请尝试以下操作:
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;
}
Dns.GetHostEntry("LocalHost").HostName
我”总是得到带有主域后缀的主机名(而不是netbios)。这不取决于计算机是域的一部分,是否可以访问DNS服务器还是已连接netzwork。可能我不明白您的解释,但结果是我所期望的。(计算机:W2008R2; .net 4.0; netbiosname:TESTNAME-VERYLO主机名:TESTNAME-VERYLONG)