Comment pouvez-vous obtenir le nom de domaine complet d'une machine locale en C #?
REMARQUE: cette solution fonctionne uniquement lorsque vous ciblez les frameworks .NET 2.0 (et plus récents).
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
}
METTRE À JOUR
Comme beaucoup de gens ont dit que la réponse de Sam était plus concise, j'ai décidé d'ajouter quelques 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 où 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, leDns.GetHostEntry("LocalHost").HostName
retournera localhost
tandis que la GetFQDN()
méthode 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 qui sont ensuite utilisés pour mapper des informations à une machine spécifique. Si les machines ne sont pas en réseau, l' localhost
identifiant est inutile, alors que le nom donne les informations nécessaires.
C'est donc finalement à chaque utilisateur quelle méthode est la mieux adaptée à son application, en fonction du résultat dont il a besoin. Mais dire que cette réponse est erronée parce qu'elle n'est pas assez concise est au mieux superficiel.
Voir un exemple où la sortie sera différente: http://ideone.com/q4S4I0
Dns.GetHostEntry("LocalHost").HostName
j'obtiens toujours le nom d'hôte (pas netbios) avec le suffixe de domaine principal. Cela ne dépend pas si la machine fait partie d'un domaine, si un serveur DNS est accessible ou si le réseau est connecté. Je ne comprends probablement pas votre explication, mais le résultat est ce que j'attends. (Machine: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO hostname: TESTNAME-VERYLONG)Dns.GetHostName()
pourhostName
au lieu d'utiliser laHostName
propriété de l'IPGlobalProperties
objet que vous avez déjà, une ligne au-dessus?IPGlobalProperties
propriété hostname renvoie le nom NetBIOS, alors queDns.GetHostName()
renvoie le nom d'hôte DNS.EndsWith
chèque est cassé pour les noms d'hôte qui se terminent par les mêmes lettres que le nom de domaine (par exemple un hôte MYHOST dans le domaine OST), devrait probablement êtreEndsWith("." + domainName)
hostName.
. Il devrait y avoir un!String.isNullorEmpty(domainName)
chèqueUne légère simplification du code de Miky D
la source
.Trim(".")
à la dernière ligne pour supprimer le fichier. s'il existe.Ceci est couvert par cet article . Cette technique est plus brève que la réponse acceptée et probablement plus fiable que la prochaine réponse la plus votée. Notez que pour autant que je sache, cela n'utilise pas de noms NetBIOS, il devrait donc convenir à une utilisation Internet.
.NET 2.0+
.NET 1.0 - 1.1
la source
Dns.GetHostEntry("LocalHost").HostName
vous faire mieux passer une chaîne vide comme ceci:Dns.GetHostEntry("").HostName
Le voici dans PowerShell, pour le plaisir:
la source
Et pour Framework 1.1, c'est aussi simple que ceci:
Et puis supprimez le nom NETBIOS de la machine pour récupérer uniquement le nom de domaine
la source
GetHostByName("localhost")
est obsolète. VS 2010 m'a suggéré d'utiliser à laGetHostEntry("localhost")
place, ce qui fonctionne très bien.Vous pouvez essayer ce qui suit:
Cela devrait vous donner le FQDN de la machine locale actuelle (ou vous pouvez spécifier n'importe quel hôte).
la source
Une légère amélioration par rapport à la réponse de Matt Z pour qu'un point final ne soit pas renvoyé si l'ordinateur n'est pas membre d'un domaine:
la source
Utilisé cela comme l'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'était pas capturé, c'était l'une des exigences des clients.
J'ai testé cela en utilisant C # 5.0, .Net 4.5.1
Construit en utilisant les idées de la solution Miky Dinescu.
la source
Nous avons implémenté le résultat suggéré à utiliser de cette manière:
Cependant, s'est avéré que cela ne fonctionne pas correctement lorsque le nom de l'ordinateur est plus long que 15 caractères et en utilisant le nom NetBios. Environment.MachineName ne renvoie qu'un nom partiel et le nom d'hôte de résolution renvoie le même nom d'ordinateur.
Après quelques recherches, nous avons trouvé une solution pour résoudre ce problème:
Cela a résolu tous les problèmes, y compris le nom de l'ordinateur.
la source
J'ai utilisé cette approche:
la source
Aucune des réponses fournies que j'ai testées n'a fourni le suffixe DNS que je recherchais. Voici ce que j'ai trouvé.
la source
Si vous voulez le ranger et gérer les exceptions, essayez ceci:
la source