如何在C#/ .NET中find本地机器的FQDN?
你怎么能得到在C#本地机器的FQDN?
注意:此解决scheme仅适用于.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 }
UPDATE
由于很多人都评论说山姆的答案更简洁,所以我决定给答案增加一些评论。
最重要的是要注意的是,我给的代码不等于下面的代码:
Dns.GetHostEntry("LocalHost").HostName
在一般情况下,当机器是networking和域的一部分,两种方法通常会产生相同的结果,在其他情况下,结果将有所不同。
输出不同的情况是当机器不是域的一部分时。 在这种情况下, Dns.GetHostEntry("LocalHost").HostName
将返回localhost
而上面的GetFQDN()
方法将返回主机的NETBIOS名称。
当find机器FQDN的目的是logging信息或生成报告时,这个区别很重要。 大多数情况下,我在日志或报告中使用这种方法,随后用于将信息映射回特定的机器。 如果机器没有联网, localhost
标识符是无用的,而名称给出了所需的信息。
所以最终取决于他们需要什么样的结果,每个用户应该select哪种方法更适合他们的应用。 但是说这个答案不够简明就是肤浅的说法。
查看输出结果不同的示例: http : //ideone.com/q4S4I0
Miky D的代码略微简化
public static string GetLocalhostFqdn() { var ipProperties = IPGlobalProperties.GetIPGlobalProperties(); return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName); }
这篇文章涵盖了这一点 。 这种技术比接受的答案更简短,可能比下一个最有投票的答案更可靠。 请注意,据我所知,这不使用NetBIOS名称,所以它应该适合Internet使用。
.NET 2.0+
Dns.GetHostEntry("LocalHost").HostName
.NET 1.0 – 1.1
Dns.GetHostByName("LocalHost").HostName
这是在PowerShell中,对于它来说:
$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties() "{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
而对于框架1.1就像这样简单:
System.Net.Dns.GetHostByName("localhost").HostName
然后删除机器的NETBIOS名称来检索只有domainName
您可以尝试以下方法:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
这应该给你当前本地机器的FQDN(或者你可以指定任何主机)。
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); }
把这个作为我的一个选项来结合主机名和域名来构build一个报告,当域名没有被捕获时添加了通用文本来填写,这是客户的要求之一。
我使用C#5.0,.Net 4.5.1进行了testing
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解决scheme的想法构build。
如果你想整理它,并处理exception,试试这个:
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; }