Pergunta

Como você pode obter o FQDN de um computador local em C #?

Foi útil?

Solução

. NOTA: Esta solução só funciona quando alvejando os 2.0 (e mais recentes) enquadramentos .NET

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
}

Atualizar

Uma vez que muitas pessoas têm comentado que Resposta de Sam é mais conciso eu decidi acrescentar alguns comentários ao resposta.

A coisa mais importante a notar é que o código que eu dei é Não equivalente para o seguinte código:

Dns.GetHostEntry("LocalHost").HostName

Enquanto no caso geral, quando a máquina está em rede e parte de um domínio, ambos os métodos geralmente produzir o mesmo resultado, em outros cenários os resultados serão diferentes.

Um cenário onde a saída será diferente é quando a máquina não faz parte de um domínio. Neste caso, o Dns.GetHostEntry("LocalHost").HostName voltará localhost enquanto o método GetFQDN() acima retornará o nome NETBIOS do host.

Esta distinção é importante quando o propósito de encontrar a máquina FQDN é para registrar informações, ou gerar um relatório. Na maioria das vezes eu usei este método em logs ou relatórios que são posteriormente utilizados para mapear informações de volta para uma máquina específica. Se as máquinas não estão em rede, o identificador localhost é inútil, enquanto o nome dá a informação necessária.

Assim, em última análise, cabe a cada utilizador qual método é mais adequado para a sua aplicação, dependendo do que resultar de que necessitam. Mas dizer que esta resposta está errada por não ser concisa o suficiente é superficial na melhor das hipóteses.

Veja um exemplo onde a saída será diferente: http://ideone.com/q4S4I0

Outras dicas

Uma ligeira simplificação do código Miky D's

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }

Este é coberto por este artigo . Esta técnica é mais rápida do que a resposta aceita e, provavelmente, mais confiável do que a próxima resposta mais votado. Note-se que, tanto quanto eu entendo, este não Usar NetBIOS nomes, por isso deve ser adequado para o uso da Internet.

.NET 2.0 +

Dns.GetHostEntry("LocalHost").HostName

.NET 1,0-1,1

Dns.GetHostByName("LocalHost").HostName

Aqui está em PowerShell, para os pedaços dele:

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

E para Framework 1.1 é tão simples como isto:

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

E, em seguida, remover o nome da máquina NETBIOS para recuperar apenas o domainName

Você pode tentar o seguinte:

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

Esta deviam dar-lhe o FQDN da máquina local atual (ou você pode especificar qualquer host).

A ligeira melhoria na resposta de Matt Z de modo que um ponto de fuga não é devolvido se o computador não é um membro de um domínio:

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}

Usado esta como uma das minhas opções para combinar o nome do host e nome de domínio para a construção de um relatório, acrescentou o texto genérico para preencher quando o nome de domínio não foi capturado, esta foi uma das exigências dos clientes.

Eu testei isso 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
} 

Construído usando idéias de solução Miky Dinescu.

Temos implementado resultado sugeriu a utilização desta forma:

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

No entanto, descobriu-se que isso não funciona direito quando o nome do computador é mais de 15 caracteres e usando o nome NetBios. O Environment.MachineName retorna apenas nome parcial e resolução de nomes de host retorna mesmo nome de computador.

Depois de alguma pesquisa, encontramos uma solução para corrigir esse problema:

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

Este resolvido todos os problemas, incluindo nome do computador.

Se você quiser arrumá-lo e lidar com exceções, tente o seguinte:

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;
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top