Como você pode obter o FQDN de uma máquina local em C #?
OBSERVAÇÃO: Esta solução só funciona quando direcionada às estruturas .NET 2.0 (e mais recentes).
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
Como muitas pessoas comentaram que a resposta de Sam é mais concisa, decidi adicionar alguns comentários à resposta.
O mais importante a notar é que o código que dei não é equivalente ao seguinte código:
Dns.GetHostEntry("LocalHost").HostName
Enquanto, no caso geral, quando a máquina está em rede e faz parte de um domínio, ambos os métodos geralmente produzem o mesmo resultado, em outros cenários os resultados serão diferentes.
Um cenário em que a saída será diferente é quando a máquina não faz parte de um domínio. Nesse caso, o Dns.GetHostEntry("LocalHost").HostName
retornará localhost
enquanto o GetFQDN()
método acima retornará o nome NETBIOS do host.
Essa distinção é importante quando o objetivo de localizar o FQDN da máquina é registrar informações ou gerar um relatório. Na maioria das vezes, usei esse método em logs ou relatórios que são subsequentemente usados para mapear informações de volta para uma máquina específica. Se as máquinas não estiverem em rede, o localhost
identificador é inútil, enquanto o nome fornece as informações necessárias.
Portanto, em última análise, cabe a cada usuário qual método é mais adequado para sua aplicação, dependendo do resultado de que precisam. Mas dizer que essa resposta está errada por não ser concisa o suficiente é superficial, na melhor das hipóteses.
Veja um exemplo em que a saída será diferente: http://ideone.com/q4S4I0
Dns.GetHostEntry("LocalHost").HostName
sempre obtenho o nome do host (não netbios) com o sufixo do domínio primário. Isso não depende se a máquina faz parte de um domínio, se um servidor DNS está acessível ou se a rede está conectada. Provavelmente não entendi sua explicação, mas o resultado é o que eu esperava. (Máquina: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO hostname: TESTNAME-VERYLONG)Dns.GetHostName()
para emhostName
vez de usar aHostName
propriedade doIPGlobalProperties
objeto que você já possui, uma linha acima?IPGlobalProperties
propriedade hostname retorna o nome NetBIOS, enquantoDns.GetHostName()
retorna o nome do host DNS.EndsWith
verificação é quebrada para nomes de host que terminam com as mesmas letras do nome de domínio (por exemplo, um host MYHOST no domínio OST), provavelmente deveria serEndsWith("." + domainName)
hostName.
. Deve haver uma!String.isNullorEmpty(domainName)
verificaçãoUma ligeira simplificação do código de Miky D
fonte
.Trim(".")
à última linha para se livrar do. se existe.Isso é coberto por este artigo . Essa técnica é mais breve do que a resposta aceita e provavelmente mais confiável do que a próxima resposta mais votada. Observe que, tanto quanto eu entendo, isso não usa nomes NetBIOS, então deve ser adequado para uso na Internet.
.NET 2.0+
.NET 1.0 - 1.1
fonte
Dns.GetHostEntry("LocalHost").HostName
lo é melhor passar uma string vazia como:Dns.GetHostEntry("").HostName
Aqui está no PowerShell, para falar a verdade:
fonte
E para o Framework 1.1 é tão simples quanto isto:
Em seguida, remova o nome NETBIOS da máquina para recuperar apenas o nome do domínio
fonte
GetHostByName("localhost")
está obsoleto. O VS 2010 sugeriu que eu usasseGetHostEntry("localhost")
, o que funciona bem.Você pode tentar o seguinte:
Este shoud fornece o FQDN da máquina local atual (ou você pode especificar qualquer host).
fonte
Uma ligeira melhoria na resposta de Matt Z para que um ponto final final não seja retornado se o computador não for membro de um domínio:
fonte
Usei isso como uma das minhas opções para combinar o nome do host e o nome do domínio para construir um relatório, adicionei o texto genérico para preencher quando o nome do domínio não fosse capturado, este era um dos requisitos do cliente.
Eu testei isso usando C # 5.0, .Net 4.5.1
Construído usando as idéias da solução Miky Dinescu.
fonte
Implementamos o resultado sugerido para usar desta forma:
No entanto, descobriu-se que isso não funciona direito quando o nome do computador tem mais de 15 caracteres e usa o nome NetBios. O Environment.MachineName retorna apenas o nome parcial e o nome do host de resolução retorna o mesmo nome de computador.
Depois de alguma pesquisa, encontramos uma solução para corrigir esse problema:
Isso resolveu todos os problemas, incluindo o nome do computador.
fonte
Eu usei esta abordagem:
fonte
Nenhuma das respostas fornecidas que eu testei realmente forneceu o sufixo DNS que eu estava procurando. Aqui está o que eu inventei.
fonte
Se você quiser organizá-lo e lidar com exceções, tente o seguinte:
fonte