Comment trouver le nom de domaine complet de la machine locale dans C # /. NET?

Comment pouvez-vous obtenir le nom de domaine complet d’une machine locale en C #?

REMARQUE: Cette solution ne fonctionne que lorsque vous ciblez les frameworks .NET 2.0 (et plus récents).

using System; using System.Net; using System.Net.NetworkInformation; //... public static ssortingng GetFQDN() { ssortingng domainName = IPGlobalProperties.GetIPGlobalProperties().DomainName; ssortingng 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 } 

METTRE À JOUR

Comme beaucoup de personnes ont commenté que la réponse de Sam est plus concise, j’ai décidé d’append des commentaires à la réponse.

La chose la plus importante à noter est que le code que j’ai donné n’est pas équivalent au code suivant:

 Dns.GetHostEntry("LocalHost").HostName 

Alors que dans le cas général, lorsque la machine est en réseau et fait partie d’un domaine, les deux méthodes produiront généralement le même résultat. Dans d’autres scénarios, les résultats seront différents.

Un scénario où la sortie sera différente est lorsque la machine ne fait pas partie d’un domaine. Dans ce cas, le Dns.GetHostEntry("LocalHost").HostName renverra localhost tandis que la méthode GetFQDN() ci-dessus renverra le nom NETBIOS de l’hôte.

Cette distinction est importante lorsque le but de la recherche du nom de domaine complet de la machine est de consigner des informations ou de générer un rapport. La plupart du temps, j’ai utilisé cette méthode dans des journaux ou des rapports utilisés par la suite pour associer des informations à une machine spécifique. Si les machines ne sont pas en réseau, l’identifiant localhost est inutile, alors que le nom donne les informations nécessaires.

Donc, en fin de compte, il appartient à chaque utilisateur quelle méthode est la mieux adaptée à son application, en fonction du résultat souhaité. Mais dire que cette réponse est erronée pour ne pas être assez concise est au mieux superficielle.

Voir un exemple où le résultat sera différent: http://ideone.com/q4S4I0

Une légère simplification du code de Miky D

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

Ceci est couvert par cet article . Cette technique est plus brève que la réponse acceptée et probablement plus fiable que la réponse la plus votée. Notez que, pour autant que je sache, cela n’utilise pas les noms NetBIOS, il devrait donc convenir à l’utilisation d’Internet.

.NET 2.0+

 Dns.GetHostEntry("LocalHost").HostName 

.NET 1.0 – 1.1

 Dns.GetHostByName("LocalHost").HostName 

Ici, c’est dans PowerShell, pour le coup:

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

Et pour Framework 1.1, c’est aussi simple que cela:

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

Et puis supprimez le nom NETBIOS de la machine pour ne récupérer que le domainName

Vous pouvez essayer ce qui suit:

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

Cela devrait vous donner le nom de domaine complet de la machine locale actuelle (ou vous pouvez spécifier n’importe quel hôte).

Une légère amélioration par rapport à la réponse de Matt Z, de sorte qu’un arrêt complet ne soit pas renvoyé si l’ordinateur n’est pas membre d’un domaine:

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

Utilisé comme une de mes options pour combiner le nom d’hôte et le nom de domaine pour créer un rapport, ajouté le texte générique à remplir lorsque le nom de domaine n’a pas été capturé, ceci était l’une des exigences des clients.

J’ai testé ceci en utilisant C # 5.0, .Net 4.5.1

 private static ssortingng GetHostnameAndDomainName() { // if No domain name return a generic ssortingng ssortingng currentDomainName = IPGlobalProperties.GetIPGlobalProperties().DomainName ?? "nodomainname"; ssortingng 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 } 

Construit en utilisant des idées de la solution Miky Dinescu.

Si vous voulez le ranger et gérer les exceptions, essayez ceci:

 public static ssortingng GetLocalhostFQDN() { ssortingng domainName = ssortingng.Empty; try { domainName = NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName; } catch { } ssortingng fqdn = "localhost"; try { fqdn = System.Net.Dns.GetHostName(); if (!ssortingng.IsNullOrEmpty(domainName)) { if (!fqdn.ToLowerInvariant().EndsWith("." + domainName.ToLowerInvariant())) { fqdn += "." + domainName; } } } catch { } return fqdn; }