如何在C#中获取本地计算机的FQDN?
答案 0 :(得分:131)
注意:此解决方案仅在定位.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's Answer更简洁,我决定在答案中添加一些评论。
最重要的是要注意的是我给出的代码与以下代码的不等同:
Dns.GetHostEntry("LocalHost").HostName
虽然在一般情况下,当机器联网并且是域的一部分时,两种方法通常会产生相同的结果,而在其他情况下,结果会有所不同。
输出不同的情况是机器不属于域时。在这种情况下,Dns.GetHostEntry("LocalHost").HostName
将返回localhost
,而上面的GetFQDN()
方法将返回主机的NETBIOS名称。
当找到计算机FQDN的目的是记录信息或生成报告时,这种区别很重要。大部分时间我都在日志或报告中使用此方法,这些日志或报告随后用于将信息映射回特定计算机。如果计算机没有联网,则localhost
标识符无效,而名称则提供所需信息。
所以最终由每个用户决定哪种方法更适合他们的应用,具体取决于他们需要什么样的结果。但是要说这个答案错误,因为不够简洁就是肤浅的。
查看输出不同的示例:http://ideone.com/q4S4I0
答案 1 :(得分:63)
Miky D代码的略微简化
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
答案 2 :(得分:24)
这由this article涵盖。这种技术比接受的答案更简短,可能比下一个最多投票的答案更可靠。请注意,据我所知,此不使用NetBIOS名称,因此它应该适合Internet使用。
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
答案 3 :(得分:17)
这是在PowerShell中,对于它来说:
$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
答案 4 :(得分:15)
对于Framework 1.1来说就像这样简单:
System.Net.Dns.GetHostByName("localhost").HostName
然后删除机器NETBIOS名称以仅检索domainName
答案 5 :(得分:8)
您可以尝试以下操作:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
这个shoud为您提供当前本地计算机的FQDN(或者您可以指定任何主机)。
答案 6 :(得分: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);
}
答案 7 :(得分: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解决方案的想法构建。
答案 8 :(得分:1)
我们已实现建议的结果以这种方式使用:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
但是,事实证明,当计算机名称超过15个字符并使用NetBios名称时,此方法将无法正常工作。 Environment.MachineName仅返回部分名称,而解析主机名返回相同的计算机名称。
经过研究,我们找到了解决此问题的解决方案:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
这解决了包括计算机名称在内的所有问题。
答案 9 :(得分:0)
我使用了这种方法:
private static string GetLocalhostFQDN()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}
答案 10 :(得分:0)
我提供的所有测试答案均未提供我要查找的DNS后缀。这就是我的想法。
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
答案 11 :(得分: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;
}
答案 12 :(得分:-8)
如果你想整理它并处理异常,试试这个:
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;
}