web-dev-qa-db-fra.com

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

Comment obtenir le FQDN d'une machine locale en C #?

83
Gabe

REMARQUE: Cette solution ne fonctionne que lors du ciblage des 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 [~ # ~]

Puisque beaucoup de gens ont commenté que Sam's Answer est plus concis, 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 lorsque la machine est en réseau et fait partie d'un domaine, les deux méthodes produisent généralement le même résultat, dans d'autres scénarios, les résultats diffèrent.

Un scénario où la sortie sera différente est lorsque la machine ne fait pas partie d'un domaine. Dans ce cas, la 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 trouver le 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 sur une machine spécifique. Si les machines ne sont pas en réseau, l'identifiant localhost est inutile, tandis que le nom donne les informations nécessaires.

En fin de compte, il appartient à chaque utilisateur de choisir la méthode la mieux adaptée à son application, en fonction du résultat dont il a besoin. Mais dire que cette réponse est erronée pour ne pas être suffisamment concis est au mieux superficiel.

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

132
Mike Dinescu

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);
    }
63
Matt Z

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, si je comprends bien, cela n'utilise pas les noms NetBIOS, il devrait donc convenir à une utilisation Internet.

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName
24
Sam

Le voici dans PowerShell, pour le diable:

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

Et pour Framework 1.1 est aussi simple que cela:

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

Et puis supprimez le nom NETBIOS de la machine pour récupérer uniquement le nom de domaine

15
javizcaino

Vous pouvez essayer ce qui suit:

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

Ce shoud vous donne le FQDN de la machine locale actuelle (ou vous pouvez spécifier n'importe quel hôte).

8
UT-Fan-05

Une légère amélioration par rapport à la réponse de Matt Z afin 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);
}
5
Bosco

J'ai 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.

2
user3500031

Nous avons implémenté le résultat suggéré pour utiliser de cette façon:

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

Cependant, il s'est avéré que cela ne fonctionne pas correctement lorsque le nom de l'ordinateur dépasse 15 caractères et en utilisant le nom NetBios. L'environnement.MachineName ne renvoie qu'un nom partiel et la résolution du nom d'hôte 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.

1
btomas