如何在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; }