C#/。NETでローカルマシンのFQDNを見つける方法


87

C#でローカルマシンのFQDNを取得するにはどうすればよいですか?

回答:


142

注:このソリューションは、.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は戻りますlocalhostGetFQDN()上記メソッドはホストのNETBIOS名を返します。

この区別は、マシンのFQDNを見つける目的が情報のログ記録またはレポートの生成である場合に重要です。ほとんどの場合、ログまたはレポートでこの方法を使用しており、その後、特定のマシンに情報をマッピングするために使用されます。マシンがネットワーク化されていない場合、localhost識別子は役に立ちが、名前は必要な情報を提供します。

したがって、最終的には、どの結果が必要かによって、どの方法がアプリケーションに適しているかは各ユーザー次第です。しかし、この答えが十分に簡潔でないために間違っていると言うことは、せいぜい表面的なものです。

出力が異なる例を参照してください:http : //ideone.com/q4S4I0


2
を使用するDns.GetHostEntry("LocalHost").HostNameと、プライマリドメインサフィックスを持つホスト名(netbiosではなく)が常に取得されます。これは、マシンがドメインの一部であるか、DNSサーバーに到達可能であるか、またはネットワークが接続されているかどうかには依存しません。おそらくあなたの説明は理解できませんが、結果は私が期待するものです。(マシン:W2008R2; .net 4.0; netbiosname:TESTNAME-VERYLOホスト名:TESTNAME-VERYLONG)
marsh-wiggle

すでに1行上のオブジェクトのプロパティを使用Dns.GetHostName()するhostName代わりに、なぜを使用するのですか?HostNameIPGlobalProperties
Xharlie

@Xharlieは、IPGlobalPropertieshostnameプロパティがNetBIOS名をDns.GetHostName()返すのに対し、DNSホスト名を返すためです。
Mike Dinescu

2
EndsWithドメイン名と同じ文字で終わるホスト名(たとえば、ドメインOSTのホストMYHOST)のホスト名のチェックは失敗しますEndsWith("." + domainName)
user3391859

6
domainNameが空の場合、これはを返しますhostName.!String.isNullorEmpty(domainName)チェックがあるはずです
RodgerTheGreat

63

Miky Dのコードを少し簡略化

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }

4
Micky Dのコードとは異なり、マシンがドメインのメンバーでない場合、これはフルストップが追加されたホスト名を返します。
ボスコ

1
また、これはDNSホスト名の代わりにNetBIOS名を使用します。NetBIOS名はLAN内でのみ適していると思います。
Sam

おそらく.Trim(".")、最後の行にを追加して、を削除します。存在する場合。
David d C e Freitas 2013年

28

これはこの記事でカバーされています。この手法は、受け入れられた回答よりも簡潔で、次に投票された回答よりもおそらく信頼性が高くなります。私が理解している限り、これ NetBIOS名を使用ため、インターネットでの使用に適していることに注意してください。

.NET 2.0以降

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0-1.1

Dns.GetHostByName("LocalHost").HostName

@DexterLegaspi-サムの答えは良いものです(私は自分でそれについても投票しました)が、私の答えと同等ではなく、必ずしも良いとは言えません。詳細については、私の最新の回答をご覧ください。
Mike Dinescu

@MikeDinescu問題は、マシンがネットワーク上にあり、ドメインの一部であることを暗示するFQDNを取得する方法です。受け入れられた答えはうまくいきますが、サムの答えはより「正確」です(より適切な用語がないため)
デクスターレガスピ

3
これが正解です。代わりに行うのでDns.GetHostEntry("LocalHost").HostName:あなたはより良いようなので、空の文字列渡しDns.GetHostEntry("").HostName
paulgutten

17

ここではPowerShellにあります。

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName

15

また、Framework 1.1の場合は次のように簡単です。

System.Net.Dns.GetHostByName("localhost").HostName

次に、マシンのNETBIOS名を削除して、domainNameのみを取得します。


ここ2013年にGetHostByName("localhost")廃止されました。VS 2010はGetHostEntry("localhost")代わりに使用することを提案しましたが、正常に機能します。
ピエダル2013

@piedar、あなたはこれが.NET 1.1のためのものであることを少し逃したかもしれません。
サム

更新された情報をこの回答に追加したかったのは、それが最も単純で、私のお気に入りだったからです。私はおそらくあなたの答えを見るのに十分なほどスクロールしなかったので、実際に私のコメントは不要になりました。
ピエダー2014

8

以下を試すことができます。

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

これにより、現在のローカルマシンのFQDNが提供されます(または任意のホストを指定できます)。


5

コンピューターがドメインのメンバーではない場合、後続の完全停止が返されないように、マットZの回答が少し改善されました。

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}

これはNetBIOSホスト名を使用していると思うので、インターネットでの使用には適さない場合があります。
Sam

2

ホスト名とドメイン名を組み合わせてレポートを作成するオプションの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ソリューションのアイデアを使用して構築されました。


1

この方法を使用するための推奨結果を実装しました:

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

ただし、コンピュータ名が15文字より長く、NetBios名を使用している場合、これは正しく機能しないことが判明しました。Environment.MachineNameは部分的な名前のみを返し、解決ホスト名は同じコンピューター名を返します。

調査の結果、この問題を解決するための解決策が見つかりました。

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName

これにより、コンピューター名を含むすべての問題が解決されました。


これは例外をスローし、ユーザーがaz、0-9、 '。'、 '-'以外の文字を含む名前をユーザーから与えられている場合、提案されている他のほとんどの解決策も失敗します。したがって、アジアなどにユーザーがいる場合は問題が発生することを期待してください。GetHostNameでは、これらの文字が「?」に置き換えられます。そのため、実際のコンピューター名を示すGetHostByName( "localhost")。HostNameを使用します。
ヨーラン・

0

私はこのアプローチを使用しました:

private static string GetLocalhostFQDN()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}

0

私がテストした答えがどれも実際には、探していたDNSサフィックスを提供していませんでした。これが私が思いついたものです。

public static string GetFqdn()
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    var ipprops = networkInterfaces.First().GetIPProperties();
    var suffix = ipprops.DnsSuffix;
    return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}

-9

それを片付けて例外を処理したい場合は、これを試してください:

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;
        }

2
「例外を処理する」-失敗。
ヨルゲンSigvardsson

uキャッチ自体が例外を処理すると思います!
Saher Ahwal

いいえ、例外の処理方法は自分で決める必要があると思います。また、ドメイン名を取り戻すことができない場合、どのように処理することを提案しますか?
ロジャーウィルコックス

4
エラーレポートを記録し、クライアントコードに誤った情報を提供する代わりに、問題が発生したことをユーザーに警告します。
dahvyd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.