C#/。NETでローカルマシンのFQDNを見つける方法は?
質問
C#でローカルマシンのFQDNを取得するにはどうすればよいですか
解決
注:このソリューションは、.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
マシンがネットワーク化され、ドメインの一部である一般的なケースでは、両方の方法で同じ結果が生成されますが、他のシナリオでは結果が異なります。
出力が異なるシナリオは、マシンがドメインの一部ではない場合です。この場合、 Dns.GetHostEntry(" LocalHost")。HostName
は localhost
を返し、上記の GetFQDN()
メソッドはホストのNETBIOS名。
この区別は、マシンの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);
}
これは、この記事で説明されています。この手法は、受け入れられた回答よりも簡潔で、おそらく次に投票された回答よりも信頼性が高くなります。私が理解している限り、これはNetBIOS名を使用しない ため、インターネットでの使用に適していることに注意してください。
.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);
}
これをレポートの作成用にホスト名とドメイン名を組み合わせるオプションの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ソリューションのアイデアを使用して構築。
この方法を使用するための推奨結果を実装しました:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
ただし、コンピューター名が15文字より長く、NetBios名を使用している場合、これは正しく機能しないことが判明しました。 Environment.MachineNameは部分的な名前のみを返し、ホスト名の解決は同じコンピューター名を返します。
調査の結果、この問題を解決する解決策が見つかりました:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
これにより、コンピューター名を含むすべての問題が解決されました。
整理して、例外を処理する場合は、これを試してください:
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;
}