Wie können Sie den vollqualifizierten Domänennamen eines lokalen Computers in C # abrufen?
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").HostName
zurückgegeben, localhost
wä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 localhost
Kennung 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
Dns.GetHostEntry("LocalHost").HostName
bekomme 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)Dns.GetHostName()
für,hostName
anstatt dieHostName
Eigenschaft desIPGlobalProperties
Objekts zu verwenden, das Sie bereits haben, eine Zeile darüber?IPGlobalProperties
Eigenschaft hostname den NetBIOS-NamenDns.GetHostName()
zurückgibt , während der DNS-Hostname zurückgegeben wird.EndsWith
Prü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)
hostName.
. Es sollte einen!String.isNullorEmpty(domainName)
Scheck gebenEine leichte Vereinfachung des Codes von Miky D.
quelle
.Trim(".")
der letzten Zeile möglicherweise ein a hinzu , um das zu entfernen. wenn es existiert.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+
.NET 1.0 - 1.1
quelle
Dns.GetHostEntry("LocalHost").HostName
Sie besser eine leere Zeichenfolge wieDns.GetHostEntry("").HostName
Hier ist es in PowerShell, zum Teufel:
quelle
Und für Framework 1.1 ist das so einfach:
Entfernen Sie dann den NETBIOS-Namen des Computers, um nur den Domänennamen abzurufen
quelle
GetHostByName("localhost")
ist überholt. VS 2010 schlug vor,GetHostEntry("localhost")
stattdessen zu verwenden, was gut funktioniert.Sie können Folgendes versuchen:
Dies sollte Ihnen den vollqualifizierten Domänennamen des aktuellen lokalen Computers geben (oder Sie können einen beliebigen Host angeben).
quelle
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:
quelle
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
Gebaut mit Ideen aus der Miky Dinescu-Lösung.
quelle
Wir haben das vorgeschlagene Ergebnis implementiert, um Folgendes zu verwenden:
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:
Dies löste alle Probleme einschließlich des Computernamens.
quelle
Ich habe diesen Ansatz verwendet:
quelle
Keine der von mir getesteten Antworten enthielt tatsächlich das gesuchte DNS-Suffix. Folgendes habe ich mir ausgedacht.
quelle
Wenn Sie es aufräumen und Ausnahmen behandeln möchten, versuchen Sie Folgendes:
quelle