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
Dns.GetHostName()
するhostName
代わりに、なぜを使用するのですか?HostName
IPGlobalProperties
IPGlobalProperties
hostnameプロパティがNetBIOS名をDns.GetHostName()
返すのに対し、DNSホスト名を返すためです。
EndsWith
ドメイン名と同じ文字で終わるホスト名(たとえば、ドメインOSTのホストMYHOST)のホスト名のチェックは失敗しますEndsWith("." + domainName)
hostName.
。!String.isNullorEmpty(domainName)
チェックがあるはずです
Miky Dのコードを少し簡略化
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
、最後の行にを追加して、を削除します。存在する場合。
Dns.GetHostEntry("LocalHost").HostName
:あなたはより良いようなので、空の文字列渡しDns.GetHostEntry("").HostName
また、Framework 1.1の場合は次のように簡単です。
System.Net.Dns.GetHostByName("localhost").HostName
次に、マシンのNETBIOS名を削除して、domainNameのみを取得します。
GetHostByName("localhost")
廃止されました。VS 2010はGetHostEntry("localhost")
代わりに使用することを提案しましたが、正常に機能します。
コンピューターがドメインのメンバーではない場合、後続の完全停止が返されないように、マット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
これにより、コンピューター名を含むすべての問題が解決されました。
私がテストした答えがどれも実際には、探していたDNSサフィックスを提供していませんでした。これが私が思いついたものです。
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
それを片付けて例外を処理したい場合は、これを試してください:
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;
}
Dns.GetHostEntry("LocalHost").HostName
と、プライマリドメインサフィックスを持つホスト名(netbiosではなく)が常に取得されます。これは、マシンがドメインの一部であるか、DNSサーバーに到達可能であるか、またはネットワークが接続されているかどうかには依存しません。おそらくあなたの説明は理解できませんが、結果は私が期待するものです。(マシン:W2008R2; .net 4.0; netbiosname:TESTNAME-VERYLOホスト名:TESTNAME-VERYLONG)