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
}
_
[〜#〜] update [〜#〜]
多くの人が Sam's Answer の方が簡潔であるとコメントしているので、答えにコメントを追加することにしました。
注意する最も重要なことは、私が与えたコードは、次のコードと同等ではないことです:
_Dns.GetHostEntry("LocalHost").HostName
_
マシンがネットワーク化され、ドメインの一部である一般的なケースでは、どちらの方法でも通常同じ結果が得られますが、他のシナリオでは結果が異なります。
出力が異なるシナリオは、マシンがドメインの一部ではない場合です。この場合、Dns.GetHostEntry("LocalHost").HostName
はlocalhost
を返し、上記のGetFQDN()
メソッドはホストのNETBIOS名を返します。
この区別は、マシンFQDNを見つける目的が情報のログ記録またはレポートの生成である場合に重要です。ほとんどの場合、ログまたはレポートでこの方法を使用し、その後、情報を特定のマシンにマップするために使用しています。マシンがネットワーク化されていない場合、localhost
識別子は役に立ちませんが、名前は必要な情報を提供します。
したがって、最終的には、必要な結果に応じて、どのメソッドがアプリケーションに適しているかは各ユーザー次第です。しかし、この答えが十分に簡潔でないために間違っていると言うことは、せいぜい表面的なことです。
出力が異なる例を参照してください。 http://ideone.com/q4S4I
Miky Dのコードを少し簡素化
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
これは この記事 でカバーされています。この手法は、受け入れられている回答よりも簡潔であり、おそらく次に投票される回答よりも信頼性が高くなります。私の知る限り、このはNetBIOS名を使用しないため、インターネットでの使用に適しているはずです。
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
ここでは、PowerShellを使用しています。
$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
また、Framework 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
これにより、コンピューター名を含むすべての問題が解決しました。