C# でローカル マシンの FQDN を取得するにはどうすればよいですか?
13 に答える
注: このソリューションは、.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
}
アップデート
多くの人がサムの回答の方が簡潔であるとコメントしているので、回答にコメントを追加することにしました。
注意すべき最も重要なことは、私が提供したコードは次のコードと同等ではないということです。
Dns.GetHostEntry("LocalHost").HostName
マシンがネットワーク化されていてドメインの一部である一般的なケースでは、どちらの方法でも一般的に同じ結果が得られますが、他のシナリオでは結果が異なります。
出力が異なるシナリオは、マシンがドメインの一部ではない場合です。この場合、上記のメソッドがホストの NETBIOS 名をDns.GetHostEntry("LocalHost").HostName
返すのlocalhost
に対し、が返されます。GetFQDN()
この区別は、マシンの FQDN を見つける目的が情報のログ記録またはレポートの生成である場合に重要です。ほとんどの場合、私はこの方法をログまたはレポートで使用してきました。これらのログまたはレポートは、後で情報を特定のマシンにマッピングするために使用されます。マシンがネットワーク化されていない場合、localhost
識別子は役に立ちませんが、名前は必要な情報を提供します。
したがって、最終的には、必要な結果に応じて、どの方法がアプリケーションにより適しているかは各ユーザー次第です。しかし、この答えが十分に簡潔ではないために間違っていると言うのは、せいぜい表面的なものです。
出力が異なる例を参照してください: http://ideone.com/q4S4I0
Miky D のコードを少し簡略化
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
これはPowerShellにあります。
$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
Framework 1.1 の場合は、次のように単純です。
System.Net.Dns.GetHostByName("localhost").HostName
次に、マシンの NETBIOS 名を削除して、ドメイン名のみを取得します
次のことを試すことができます。
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
これにより、現在のローカル マシンの FQDN が得られます (または任意のホストを指定できます)。
レポートを作成するためにホスト名とドメイン名を組み合わせるオプションの 1 つとしてこれを使用し、ドメイン名が取得されなかった場合に記入する一般的なテキストを追加しました。これは顧客の要件の 1 つでした。
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 ソリューションのアイデアを使用して構築されました。
FQ Hostname / Hostname / NetBIOS Machinename / DomainName に関するすべてのケースを処理するためのメソッドのコレクション
/// <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;
}
整理して例外を処理したい場合は、これを試してください:
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;
}