Question

Comment obtenir le nom de domaine complet d'un ordinateur local en C #?

Était-ce utile?

La solution

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 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
}

MISE À JOUR

Comme beaucoup de gens ont fait remarquer que la réponse de Sam est plus concise, j'ai décidé d'ajouter quelques commentaires à la répondre.

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

Dns.GetHostEntry("LocalHost").HostName

Bien que, dans le cas général, lorsque la machine soit en réseau et fasse partie d'un domaine, les deux méthodes produisent généralement le même résultat, dans d'autres cas, les résultats sont différents.

Un scénario dans lequel la sortie sera différente est celui où la machine ne fait pas partie d'un domaine. Dans ce cas, 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 la recherche du nom de domaine complet de la machine a pour but 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 sur une machine spécifique. Si les machines ne sont pas en réseau, l'identifiant localhost est inutile, alors que le nom fournit les informations nécessaires.

En fin de compte, il appartient à chaque utilisateur de choisir la méthode la mieux adaptée à leur application, en fonction du résultat souhaité. Mais dire que cette réponse est fausse pour ne pas être assez concis est au mieux superficiel.

Voir un exemple où la sortie sera différente: http://ideone.com/q4S4I0

Autres conseils

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);
    }

Cet élément 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 suivante la plus votée. Notez que, si je comprends bien, ce n'utilise pas les noms NetBIOS, il devrait donc convenir à Internet.

.NET 2.0 +

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName

Le voici dans PowerShell, pour le plaisir:

$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

Ensuite, supprimez le nom NETBIOS de l'ordinateur pour récupérer uniquement le nom de domaine

Vous pouvez essayer les solutions suivantes:

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 point final 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);
}

Ceci est l'une de mes options pour combiner le nom d'hôte et le nom de domaine pour la création d'un rapport, l'ajout du texte générique à remplir lorsque le nom de domaine n'a pas été capturé. C'était l'une des exigences du client.

J'ai testé cela avec 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 à partir des idées de la solution Miky Dinescu.

Nous avons implémenté le résultat suggéré pour utiliser cette méthode:

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

Cependant, il est apparu que cela ne fonctionnait pas correctement lorsque le nom de l'ordinateur comptait plus de 15 caractères et utilisait le nom NetBios. Environment.MachineName ne renvoie qu'un nom partiel et le nom d'hôte qui le résout 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.

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;
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top