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

Respuestas:

143

NOTA: Esta solución solo funciona cuando se dirige a los marcos .NET 2.0 (y más nuevos).

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
}

ACTUALIZAR

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 no es equivalente al siguiente código:

Dns.GetHostEntry("LocalHost").HostName

Mientras que en el caso general cuando la máquina está en red y es 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, Dns.GetHostEntry("LocalHost").HostNamevolverá localhostmientras que el GetFQDN()método 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 registros o informes que se utilizan posteriormente para asignar información a una máquina específica. Si las máquinas no están en red, el localhostidentificador es inútil, mientras que el nombre proporciona la información necesaria.

Así que, en última instancia, depende de cada usuario qué método se adapta mejor a su aplicación, según el resultado que necesite. Pero decir que esta respuesta es incorrecta por no ser lo suficientemente concisa es, en el mejor de los casos, superficial.

Vea un ejemplo donde la salida será diferente: http://ideone.com/q4S4I0

Mike Dinescu
fuente
2
Al usar Dns.GetHostEntry("LocalHost").HostNameobtengo siempre el nombre de host (no netbios) con el sufijo de dominio principal. Esto no depende de si la máquina es parte de un dominio, si se puede acceder a un servidor DNS o si la red está conectada. Probablemente no entiendo tu explicación pero el resultado es el que esperaba. (Máquina: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO nombre de host: TESTNAME-MUYLONG)
marsh-wiggle
¿Por qué usa Dns.GetHostName()for en hostNamelugar de usar la HostNamepropiedad del IPGlobalPropertiesobjeto que ya tiene, una línea arriba?
Xharlie
@Xharlie porque la IPGlobalPropertiespropiedad de nombre de host devuelve el nombre NetBIOS, mientras que Dns.GetHostName()devuelve el nombre de host DNS.
Mike Dinescu
2
el EndsWithcheque se rompe por los nombres de host que terminan con las mismas letras que el nombre de dominio (por ejemplo, un huésped en myhost OST de dominio), probablemente debería serEndsWith("." + domainName)
user3391859
6
Si domainName está vacío, esto regresa hostName.. Debería haber un !String.isNullorEmpty(domainName)cheque
RodgerTheGreat
63

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);
    }
Matt Z
fuente
4
A diferencia del código de Micky D, este devuelve el nombre de host con un tope completo si la máquina no es miembro de un dominio.
Bosco
1
Además, utiliza el nombre NetBIOS en lugar del nombre de host DNS. Creo que los nombres NetBIOS solo son adecuados dentro de las LAN.
Sam
Quizás agregue a .Trim(".")a la última línea para deshacerse del. si existiera.
David d C e Freitas
28

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, según tengo entendido, esto no usa nombres NetBIOS, por lo que debería ser adecuado para uso en Internet.

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName
Sam
fuente
@DexterLegaspi - La respuesta de Sam es buena (incluso la he actualizado yo mismo) pero no es equivalente a mi respuesta, ni necesariamente mejor. Consulte mi respuesta actualizada para obtener más detalles.
Mike Dinescu
@MikeDinescu la pregunta es cómo obtener el FQDN, que connota que la máquina está en una red y es parte de un dominio. la respuesta aceptada funciona, pero la respuesta de Sam es más "precisa" (a falta de un término mejor)
Dexter Legaspi
3
¡Esta es la respuesta correcta! pero en lugar de hacerlo, Dns.GetHostEntry("LocalHost").HostNamees mejor que pase una cadena vacía así:Dns.GetHostEntry("").HostName
paulgutten
17

Aquí está en PowerShell, por el gusto de hacerlo:

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
halr9000
fuente
15

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

javizcaino
fuente
Aquí en 2013, GetHostByName("localhost")está obsoleto. VS 2010 sugirió que use GetHostEntry("localhost")en su lugar, lo que funciona bien.
piedar
@piedar, es posible que se haya perdido la parte de que esto es para .NET 1.1.
Sam
Quería agregar información actualizada a esta respuesta, ya que era la más simple y, por lo tanto, mi favorita. Probablemente no me desplacé lo suficiente para ver tu respuesta, lo que de hecho hizo que mi comentario fuera innecesario.
piedar
8

Puedes probar lo siguiente:

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

Esto debería darle el FQDN de la máquina local actual (o puede especificar cualquier host).

UT-Fan-05
fuente
5

Una ligera mejora en la respuesta de Matt Z para que no se devuelva un punto final si la computadora 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);
}
Bosco
fuente
Tenga en cuenta que creo que esto usa el nombre de host NetBIOS, por lo que puede que no sea adecuado para el uso de Internet.
Sam
2

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

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 con ideas de la solución Miky Dinescu.

user3500031
fuente
1

Hemos implementado el resultado sugerido para usar de esta manera:

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

Sin embargo, resultó que esto no funciona bien cuando el nombre de la computadora tiene más de 15 caracteres y usa el nombre NetBios. Environment.MachineName devuelve solo un nombre parcial y la resolución del nombre de host devuelve el mismo nombre de computadora.

Después de investigar un poco, encontramos una solución para solucionar este problema:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName

Esto resolvió todos los problemas, incluido el nombre de la computadora.

btomas
fuente
Esto arrojará una excepción, y la mayoría de las otras soluciones sugeridas también fallarán, si tiene una computadora a la que el usuario le ha dado un nombre que contiene caracteres que no son az, 0-9, '.', '-'. Así que espere problemas si tiene usuarios en Asia o similar. GetHostName tendrá esos caracteres reemplazados por '?'. Por eso prefiero GetHostByName ("localhost"). HostName que muestra el nombre real de la computadora.
Göran
0

He usado este enfoque:

private static string GetLocalhostFQDN()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}
isxaker
fuente
0

Ninguna de las respuestas proporcionadas que probé en realidad proporcionó el sufijo DNS que estaba buscando. Esto es lo que se me ocurrió.

public static string GetFqdn()
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    var ipprops = networkInterfaces.First().GetIPProperties();
    var suffix = ipprops.DnsSuffix;
    return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
Jon Davis
fuente
-9

Si desea ordenarlo y manejar excepciones, intente 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;
        }
Roger Willcocks
fuente
2
"y manejar excepciones" - FAIL.
Jörgen Sigvardsson
¡Crees que la captura por sí sola maneja la excepción!
Saher Ahwal
No, creo que cómo quieres manejar las excepciones es algo que debes decidir por ti mismo. Y si no puede recuperar un nombre de dominio, ¿cómo propondría USTED manejarlo?
Roger Willcocks
4
Registre un informe de error y advierta al usuario que algo salió mal en lugar de proporcionar información defectuosa al código del cliente.
dahvyd