Comment pouvez-vous obtenir le nom de domaine complet d'une machine locale en C #?
Réponses:
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.GetHostName()
pour hostName
au lieu d'utiliser la HostName
propriété de l' IPGlobalProperties
objet que vous avez déjà, une ligne au-dessus?
IPGlobalProperties
propriété hostname renvoie le nom NetBIOS, alors que Dns.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èque
Une légère simplification du code de Miky D
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.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.
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
vous faire mieux passer une chaîne vide comme ceci:Dns.GetHostEntry("").HostName
Et pour Framework 1.1, c'est aussi simple que ceci:
System.Net.Dns.GetHostByName("localhost").HostName
Et puis supprimez le nom NETBIOS de la machine pour récupérer uniquement le nom de domaine
GetHostByName("localhost")
est obsolète. VS 2010 m'a suggéré d'utiliser à la GetHostEntry("localhost")
place, ce qui fonctionne très bien.
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:
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
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
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
}
Construit en utilisant les idées de la solution Miky Dinescu.
Nous avons implémenté le résultat suggéré à utiliser de cette manière:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
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:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
Cela a résolu tous les problèmes, y compris le nom de l'ordinateur.
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é.
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
Si vous voulez le ranger et gérer les exceptions, essayez ceci:
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;
}
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)