Jak znaleźć FQDN lokalnej maszyny W C#/. Net?

Jak można uzyskać FQDN lokalnej maszyny W C#?

Author: Sam, 2009-04-30

9 answers

UWAGA: To rozwiązanie działa tylko wtedy, gdy obsługuje frameworki. NET 2.0 (i nowsze).

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
}

UPDATE

Ponieważ wiele osób skomentowało, że odpowiedź sama jest bardziej zwięzła, postanowiłem dodać kilka komentarzy do odpowiedzi.

Najważniejsze jest to, że podany przeze mnie kod jest nie równoważny do następującego kodu:

Dns.GetHostEntry("LocalHost").HostName

Podczas gdy w ogólnym przypadku, gdy maszyna jest podłączona do sieci i jest częścią domeny, obie metody zazwyczaj dają ten sam wynik, w innych scenariuszach wyniki będą się różnić.

Scenariusz, w którym wyjście będzie inne, jest wtedy, gdy maszyna nie jest częścią domeny. W tym przypadku Dns.GetHostEntry("LocalHost").HostName zwróci localhost, podczas gdy powyższa metoda GetFQDN() zwróci nazwę NETBIOS hosta.

Rozróżnienie to jest ważne, gdy celem znalezienia maszyny FQDN jest zalogowanie informacji lub wygenerowanie raportu. Przez większość czasu używałem tej metody w logach lub raporty, które są następnie wykorzystywane do mapowania informacji z powrotem do określonej maszyny. Jeśli maszyny nie są połączone w sieć, identyfikator localhost jest bezużyteczny, podczas gdy nazwa podaje potrzebne informacje.

Więc ostatecznie od każdego użytkownika zależy, Która metoda jest lepiej dostosowana do jego zastosowania, w zależności od potrzeb. Ale stwierdzenie, że ta odpowiedź jest zła, ponieważ nie jest wystarczająco zwięzła, jest w najlepszym razie powierzchowne.

Zobacz przykład, w którym wynik będzie inny: http://ideone.com/q4S4I0

 127
Author: Mike Dinescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:45

Małe uproszczenie kodu Miky ' ego D

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }
 63
Author: Matt Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-18 20:58:11

Jest to objęte tym artykułem . Ta technika jest krótsza niż przyjęta odpowiedź i prawdopodobnie bardziej wiarygodna niż następna najczęściej głosowana odpowiedź. Zauważ, że o ile rozumiem, to nie używa nazw NetBIOS, więc powinno być odpowiednie do użytku w Internecie.

. NET 2.0 +

Dns.GetHostEntry("LocalHost").HostName

. NET 1.0-1.1

Dns.GetHostByName("LocalHost").HostName
 20
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 05:14:35

Tutaj jest w PowerShell, do cholery:

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
 17
Author: halr9000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-14 19:26:53

A dla frameworka 1.1 jest tak proste:

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

A następnie usuń nazwę NetBIOS komputera, aby pobrać tylko nazwę domeny

 15
Author: javizcaino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 23:08:51

Możesz spróbować:

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

Ten shoud daje FQDN bieżącej maszyny lokalnej(lub możesz podać dowolny host).

 8
Author: UT-Fan-05,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 14:18:19

Niewielka poprawa odpowiedzi Matta Z tak, że końcowy kropka 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);
}
 5
Author: Bosco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-12 09:15:52

Użyłem tego jako jednej z moich opcji łączenia nazwy hosta i nazwy domeny do budowania raportu, dodałem ogólny tekst do wypełnienia, gdy nazwa domeny nie została przechwycona, było to jedno z wymagań klientów.

Testowałem to używając 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.

 2
Author: user3500031,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-16 17:10:20

Jeśli chcesz to uporządkować i zająć się wyjątkami, 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;
        }
 -8
Author: Roger Willcocks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-15 23:42:47