Wie finde ich den vollqualifizierten Domänennamen des lokalen Computers in C # /. NET?

87

Wie können Sie den vollqualifizierten Domänennamen eines lokalen Computers in C # abrufen?

Sam
quelle

Antworten:

140

HINWEIS: Diese Lösung funktioniert nur, wenn Sie auf .NET 2.0-Frameworks (und neuere Frameworks) abzielen.

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
}

AKTUALISIEREN

Da viele Leute kommentiert haben, dass Sams Antwort prägnanter ist, habe ich beschlossen, der Antwort einige Kommentare hinzuzufügen.

Das Wichtigste ist, dass der von mir angegebene Code nicht dem folgenden Code entspricht:

Dns.GetHostEntry("LocalHost").HostName

Während im allgemeinen Fall, wenn der Computer vernetzt ist und Teil einer Domäne ist, beide Methoden im Allgemeinen das gleiche Ergebnis erzielen, unterscheiden sich die Ergebnisse in anderen Szenarien.

Ein Szenario, in dem die Ausgabe unterschiedlich ist, ist, wenn der Computer nicht Teil einer Domäne ist. In diesem Fall wird der Dns.GetHostEntry("LocalHost").HostNamezurückgegeben, localhostwährend die GetFQDN()obige Methode den NETBIOS-Namen des Hosts zurückgibt.

Diese Unterscheidung ist wichtig, wenn der Zweck des Auffindens des vollqualifizierten Domänennamens der Maschine darin besteht, Informationen zu protokollieren oder einen Bericht zu erstellen. Die meiste Zeit habe ich diese Methode in Protokollen oder Berichten verwendet, die anschließend verwendet werden, um Informationen einem bestimmten Computer zuzuordnen. Wenn die Maschinen nicht vernetzt sind, ist die localhostKennung unbrauchbar, während der Name die erforderlichen Informationen enthält.

Letztendlich liegt es also an jedem Benutzer, welche Methode für seine Anwendung besser geeignet ist, je nachdem, welches Ergebnis er benötigt. Aber zu sagen, dass diese Antwort falsch ist, weil sie nicht präzise genug ist, ist bestenfalls oberflächlich.

Sehen Sie sich ein Beispiel an, in dem die Ausgabe anders sein wird: http://ideone.com/q4S4I0

Mike Dinescu
quelle
2
Mit Dns.GetHostEntry("LocalHost").HostNamebekomme ich immer den Hostnamen (nicht NetBios) mit dem primären Domain-Suffix. Dies hängt nicht davon ab, ob der Computer Teil einer Domäne ist, ein DNS-Server erreichbar ist oder das Netzwerk verbunden ist. Wahrscheinlich verstehe ich Ihre Erklärung nicht, aber das Ergebnis ist das, was ich erwarte. (Maschine: W2008R2; .net 4.0; NetBiosname: TESTNAME-VERYLO Hostname: TESTNAME-VERYLONG)
Marsh-Wiggle
Warum verwenden Sie Dns.GetHostName()für, hostNameanstatt die HostNameEigenschaft des IPGlobalPropertiesObjekts zu verwenden, das Sie bereits haben, eine Zeile darüber?
Xharlie
@Xharlie, da die IPGlobalPropertiesEigenschaft hostname den NetBIOS-Namen Dns.GetHostName()zurückgibt , während der DNS-Hostname zurückgegeben wird.
Mike Dinescu
2
Die EndsWithPrüfung für Hostnamen, die mit den gleichen Buchstaben wie der Domainname enden (z. B. ein Host MYHOST in Domain OST), sollte wahrscheinlich seinEndsWith("." + domainName)
Benutzer3391859
5
Wenn domainName leer ist, wird dies zurückgegeben hostName.. Es sollte einen !String.isNullorEmpty(domainName)Scheck geben
RodgerTheGreat
63

Eine leichte Vereinfachung des Codes von Miky D.

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }
Matt Z.
quelle
4
Im Gegensatz zum Code von Micky D gibt dies den Hostnamen mit einem angehängten Punkt zurück, wenn der Computer kein Mitglied einer Domäne ist.
Bosco
1
Dabei wird auch der NetBIOS-Name anstelle des DNS-Hostnamens verwendet. Ich glaube, NetBIOS-Namen sind nur in LANs geeignet.
Sam
Fügen Sie .Trim(".")der letzten Zeile möglicherweise ein a hinzu , um das zu entfernen. wenn es existiert.
David d C e Freitas
27

Dies wird in diesem Artikel behandelt . Diese Technik ist kürzer als die akzeptierte Antwort und wahrscheinlich zuverlässiger als die am zweithäufigsten gewählte Antwort. Beachten Sie, dass dies meines Wissens keine NetBIOS-Namen verwendet und daher für die Internetnutzung geeignet sein sollte.

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName
Sam
quelle
@DexterLegaspi - Sams Antwort ist gut (ich habe sie sogar selbst verbessert), aber sie entspricht nicht meiner Antwort und ist auch nicht unbedingt besser. Weitere Informationen finden Sie in meiner aktualisierten Antwort.
Mike Dinescu
@MikeDinescu Die Frage ist, wie man einen vollqualifizierten Domänennamen erhält, was bedeutet, dass sich der Computer in einem Netzwerk befindet und Teil einer Domäne ist. Die akzeptierte Antwort macht den Job, aber Sams Antwort ist "präziser" (mangels eines besseren Ausdrucks)
Dexter Legaspi
3
Das ist die richtige Antwort! aber anstatt es zu tun, übergeben Dns.GetHostEntry("LocalHost").HostNameSie besser eine leere Zeichenfolge wie Dns.GetHostEntry("").HostName
folgt
17

Hier ist es in PowerShell, zum Teufel:

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

Und für Framework 1.1 ist das so einfach:

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

Entfernen Sie dann den NETBIOS-Namen des Computers, um nur den Domänennamen abzurufen

javizcaino
quelle
Hier im Jahr 2013 GetHostByName("localhost")ist überholt. VS 2010 schlug vor, GetHostEntry("localhost")stattdessen zu verwenden, was gut funktioniert.
Piedar
@piedar, vielleicht haben Sie das bisschen verpasst, dass dies für .NET 1.1 ist.
Sam
Ich wollte dieser Antwort aktualisierte Informationen hinzufügen, da dies die einfachste und damit meine Lieblingsantwort war. Ich habe wahrscheinlich nicht weit genug gescrollt, um Ihre Antwort zu sehen, was meinen Kommentar tatsächlich unnötig gemacht hatte.
Piedar
8

Sie können Folgendes versuchen:

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

Dies sollte Ihnen den vollqualifizierten Domänennamen des aktuellen lokalen Computers geben (oder Sie können einen beliebigen Host angeben).

UT-Fan-05
quelle
5

Eine leichte Verbesserung der Antwort von Matt Z, sodass ein abschließender Punkt nicht zurückgegeben wird, wenn der Computer kein Mitglied einer Domain ist:

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
Bosco
quelle
Beachten Sie, dass ich denke, dass dies den NetBIOS-Hostnamen verwendet, sodass er möglicherweise nicht für die Internetnutzung geeignet ist.
Sam
2

Ich habe dies als eine meiner Optionen zum Kombinieren von Hostname und Domainname zum Erstellen eines Berichts verwendet und den generischen Text hinzugefügt, der ausgefüllt werden soll, wenn der Domainname nicht erfasst wurde. Dies war eine der Kundenanforderungen.

Ich habe dies mit C # 5.0, .Net 4.5.1 getestet

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
} 

Gebaut mit Ideen aus der Miky Dinescu-Lösung.

user3500031
quelle
1

Wir haben das vorgeschlagene Ergebnis implementiert, um Folgendes zu verwenden:

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

Es stellte sich jedoch heraus, dass dies nicht richtig funktioniert, wenn der Computername länger als 15 Zeichen ist und der NetBios-Name verwendet wird. Der Environment.MachineName gibt nur einen Teilnamen zurück, und das Auflösen des Hostnamens gibt denselben Computernamen zurück.

Nach einigen Recherchen haben wir eine Lösung gefunden, um dieses Problem zu beheben:

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

Dies löste alle Probleme einschließlich des Computernamens.

btomas
quelle
0

Ich habe diesen Ansatz verwendet:

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

Keine der von mir getesteten Antworten enthielt tatsächlich das gesuchte DNS-Suffix. Folgendes habe ich mir ausgedacht.

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

Wenn Sie es aufräumen und Ausnahmen behandeln möchten, versuchen Sie Folgendes:

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;
        }
Roger Willcocks
quelle
2
"und Ausnahmen behandeln" - FAIL.
Jörgen Sigvardsson
Du denkst, Catch alleine behandelt die Ausnahme!
Saher Ahwal
Nein, ich denke, wie Sie mit Ausnahmen umgehen möchten, müssen Sie selbst entscheiden. Und wenn Sie keinen Domainnamen zurückbekommen können, wie würden SIE vorschlagen, damit umzugehen?
Roger Willcocks
4
Protokollieren Sie einen Fehlerbericht und warnen Sie den Benutzer, dass ein Fehler aufgetreten ist, anstatt den Clientcode mit fehlerhaften Informationen zu versorgen.
Dahvyd