Antworten:
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.GetHostName()
für, hostName
anstatt die HostName
Eigenschaft des IPGlobalProperties
Objekts zu verwenden, das Sie bereits haben, eine Zeile darüber?
IPGlobalProperties
Eigenschaft hostname den NetBIOS-Namen Dns.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 geben
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);
}
.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.
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
Sie besser eine leere Zeichenfolge wie Dns.GetHostEntry("").HostName
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
GetHostByName("localhost")
ist überholt. VS 2010 schlug vor, GetHostEntry("localhost")
stattdessen zu verwenden, was gut funktioniert.
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);
}
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.
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.
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}";
}
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;
}
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)