Jak uzyskać nazwę FQDN komputera lokalnego w języku C #?
Odpowiedzi:
UWAGA: To rozwiązanie działa tylko w przypadku platformy .NET 2.0 (i nowszej).
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
}
AKTUALIZACJA
Ponieważ wiele osób skomentowało, że odpowiedź Sama jest bardziej zwięzła, postanowiłem dodać kilka komentarzy do odpowiedzi.
Najważniejszą rzeczą do zapamiętania jest to, że kod, który podałem, nie jest równoważny z następującym kodem:
Dns.GetHostEntry("LocalHost").HostName
Podczas gdy w ogólnym przypadku, gdy maszyna jest podłączona do sieci i stanowi część domeny, obie metody generalnie dadzą ten sam wynik, w innych scenariuszach wyniki będą się różnić.
Scenariusz, w którym dane wyjściowe będą inne, to sytuacja, w której maszyna nie jest częścią domeny. W tym przypadku Dns.GetHostEntry("LocalHost").HostName
zwróci wartość, localhost
a GetFQDN()
powyższa metoda zwróci nazwę NETBIOS hosta.
To rozróżnienie jest ważne, gdy celem znalezienia nazwy FQDN maszyny jest zarejestrowanie informacji lub wygenerowanie raportu. Przez większość czasu korzystałem z tej metody w dziennikach lub raportach, które są następnie używane do mapowania informacji z powrotem do określonej maszyny. Jeśli maszyny nie są podłączone do sieci, localhost
identyfikator jest bezużyteczny, podczas gdy nazwa zawiera potrzebne informacje.
Ostatecznie to od każdego użytkownika zależy, która metoda będzie lepiej dopasowana do jego aplikacji, w zależności od tego, jakiego wyniku potrzebują. Ale stwierdzenie, że ta odpowiedź jest błędna, ponieważ nie jest wystarczająco zwięzła, jest w najlepszym przypadku powierzchowne.
Zobacz przykład, w którym wynik będzie inny: http://ideone.com/q4S4I0
Dns.GetHostName()
for hostName
zamiast używać HostName
właściwości IPGlobalProperties
obiektu, który już masz, jeden wiersz powyżej?
IPGlobalProperties
właściwość hostname zwraca nazwę NetBIOS, podczas gdy Dns.GetHostName()
zwraca nazwę hosta DNS.
EndsWith
wyboru jest złamane dla hostów, że koniec z tymi samymi literami jak nazwy domeny (np myhost gospodarza w OST domeny), powinny prawdopodobnieEndsWith("." + domainName)
hostName.
. Powinien być !String.isNullorEmpty(domainName)
czek
Drobne uproszczenie kodu Miky D.
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
do ostatniej linii, aby pozbyć się. jeśli istnieje.
Jest to omówione w tym artykule . Ta technika jest krótsza niż zaakceptowana odpowiedź i prawdopodobnie bardziej wiarygodna niż kolejna odpowiedź z największą liczbą głosów. Zauważ, że o ile rozumiem, nie używa to nazw NetBIOS, więc powinno być odpowiednie do użytku w Internecie.
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
, lepiej Dns.GetHostEntry("").HostName
A dla Framework 1.1 jest tak proste:
System.Net.Dns.GetHostByName("localhost").HostName
Następnie usuń nazwę NETBIOS komputera, aby pobrać tylko nazwę domeny
GetHostByName("localhost")
jest przestarzały. VS 2010 zasugerował, żebym GetHostEntry("localhost")
zamiast tego użył , co działa dobrze.
Niewielkie ulepszenie odpowiedzi Matta Z, tak że kropka na końcu nie jest zwracana, jeśli komputer nie jest członkiem domeny:
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
Użyłem tego jako jednej z moich opcji połączenia nazwy hosta i nazwy domeny w celu zbudowania raportu, dodałem ogólny tekst do wypełnienia, gdy nazwa domeny nie została przechwycona, było to jedno z wymagań klientów.
Przetestowałem to przy użyciu 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
}
Zbudowany przy użyciu pomysłów z rozwiązania Miky Dinescu.
Zaimplementowaliśmy sugerowany wynik do wykorzystania w ten sposób:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
Okazało się jednak, że nie działa to dobrze, gdy nazwa komputera jest dłuższa niż 15 znaków i używa nazwy NetBios. Środowisko Environment.MachineName zwraca tylko częściową nazwę, a rozpoznawanie nazwy hosta zwraca tę samą nazwę komputera.
Po kilku badaniach znaleźliśmy rozwiązanie tego problemu:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
To rozwiązało wszystkie problemy, w tym nazwę komputera.
Żadna z odpowiedzi, które testowałem, nie zawierała sufiksu DNS, którego szukałem. Oto, co wymyśliłem.
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
Jeśli chcesz to uporządkować i obsłużyć wyjątki, spróbuj tego:
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
, zawsze otrzymuję nazwę hosta (nie netbios) z sufiksem domeny podstawowej. Nie zależy to od tego, czy maszyna jest częścią domeny, czy serwer DNS jest osiągalny, czy sieć jest podłączona. Prawdopodobnie nie rozumiem twojego wyjaśnienia, ale wynik jest taki, jakiego oczekuję. (Maszyna: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO nazwa hosta: TESTNAME-VERYLONG)