¿Cómo encontrar FQDN de una máquina local en C#/. NET?


¿Cómo puede obtener el FQDN de una máquina local en C#?

Author: Sam, 2009-04-30

9 answers

NOTA: Esta solución solo funciona cuando se dirige a los frameworks.NET 2.0 (y posteriores).

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

Dado que mucha gente ha comentado que La respuesta de Sam es más concisa, he decidido agregar algunos comentarios a la respuesta.

Lo más importante a tener en cuenta es que el código que di es no equivalente al siguiente código:

Dns.GetHostEntry("LocalHost").HostName

Mientras que en el caso general cuando la máquina está conectada en red y forma parte de un dominio, ambos métodos generalmente producirán el mismo resultado, en otros escenarios los resultados serán diferentes.

Un escenario donde la salida será diferente es cuando la máquina no es parte de un dominio. En este caso, el Dns.GetHostEntry("LocalHost").HostName devolverá localhost mientras que el método GetFQDN() anterior devolverá el nombre NETBIOS del host.

Esta distinción es importante cuando el propósito de encontrar el FQDN de la máquina es registrar información o generar un informe. La mayoría de las veces he utilizado este método en los registros o informes que se utilizan posteriormente para asignar información a una máquina específica. Si las máquinas no están conectadas en red, el identificador localhost es inútil, mientras que el nombre proporciona la información necesaria.

Así que, en última instancia, depende de cada usuario qué método es el más adecuado para su aplicación, dependiendo del resultado que necesiten. Pero decir que esta respuesta es incorrecta por no ser lo suficientemente concisa es superficial en el mejor de los casos.

Vea un ejemplo donde la salida será diferente: 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:45

Una ligera simplificación del código de Miky 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-18 20:58:11

Esto está cubierto por este artículo. Esta técnica es más breve que la respuesta aceptada y probablemente más confiable que la siguiente respuesta más votada. Tenga en cuenta que, por lo que yo entiendo, este no utiliza nombres NetBIOS, por lo que debería ser adecuado para el uso de Internet.

. 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-13 05:14:35

Aquí está en PowerShell, por supuesto:

$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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-14 19:26:53

Y para Framework 1.1 es tan simple como esto:

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

Y luego elimine el nombre NETBIOS de la máquina para recuperar solo el nombre de dominio

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 23:08:51

Puede intentar lo siguiente:

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

Esto le dará el FQDN de la máquina local actual (o puede especificar cualquier 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-25 14:18:19

Una ligera mejora en la respuesta de Matt Z para que no se devuelva un punto final si el equipo no es miembro de un dominio:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-12 09:15:52

Usó esto como una de mis opciones para combinar el nombre de host y el nombre de dominio para crear un informe, agregó el texto genérico para completar cuando el nombre de dominio no se capturó, este era uno de los requisitos de los clientes.

Probé esto usando 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
} 

Construido usando ideas de la solución 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-16 17:10:20

Si quieres ordenarlo y manejar excepciones, prueba esto:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-15 23:42:47