Como encontrar o FQDN da máquina local em c # / .net?

Como você pode obter o FQDN de uma máquina local em c #?

OBSERVAÇÃO: essa solução só funciona ao direcionar as estruturas do .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 Sam’s Answer é mais conciso, decidi acrescentar alguns comentários à resposta.

A coisa mais importante a notar é que o código que eu 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 methods 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 método GetFQDN() acima retornará o nome NETBIOS do host.

Essa distinção é importante quando o objective de localizar o FQDN da máquina é registrar informações ou gerar um relatório. Na maior parte do tempo, usei esse método em logs ou relatórios que são usados ​​posteriormente para mapear as informações de volta para uma máquina específica. Se as máquinas não estiverem conectadas em rede, o identificador de localhost será inútil, enquanto o nome fornecerá as informações necessárias.

Então, em última análise, cabe a cada usuário qual método é mais adequado para sua aplicação, dependendo do resultado necessário. Mas dizer que essa resposta está errada por não ser concisa é superficial, na melhor das hipóteses.

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

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

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

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. Note que, tanto quanto eu entendo, isso não usa nomes NetBIOS, por isso deve ser adequado para uso da Internet.

.NET 2.0+

 Dns.GetHostEntry("LocalHost").HostName 

.NET 1.0 – 1.1

 Dns.GetHostByName("LocalHost").HostName 

Aqui está no PowerShell, pelo menos:

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

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

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

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

Você pode tentar o seguinte:

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

Este código fornece o FQDN da máquina local atual (ou você pode especificar qualquer host).

Uma pequena melhora na resposta de Matt Z para que um ponto final não seja retornado se o computador não for 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); } 

Usei isso como uma das minhas opções para combinar o nome do host e o nome do domínio para criar um relatório, adicionei o texto genérico para preencher quando o nome do domínio não foi capturado, esse era um dos requisitos do cliente.

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 da solução Miky Dinescu.

Se você quiser arrumar tudo 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; }