web-dev-qa-db-fra.com

Obtenez le nom de domaine

Mon ordinateur se trouve dans un domaine (Active Directory) et j'ai besoin d'obtenir le nom de domaine de manière dynamique. J'ai trouvé le code suivant sur Internet:

SelectQuery query = new SelectQuery("Win32_ComputerSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
    foreach (ManagementObject mo in searcher.Get())
    {
        if ((bool)mo["partofdomain"])
        {
            this.Domain = mo["domain"].ToString();
            break;
        }
    }
 }

Il fonctionne exactement comme je le souhaite et renvoie exactement le nom de domaine comme je le souhaite (lorsque je suis connecté en tant qu'administrateur). Si l'utilisateur n'est pas un administrateur de domaine, j'ai un Access denied exception.

Quelqu'un sait-il comment obtenir le domaine même avec des utilisateurs non administrateurs de domaine?

REMARQUE: j'ai trouvé cette solution sur Internet System.Environment.UserDomainName; mais cela ne me donne qu'une partie du nom de domaine.

C'est à dire. mon domaine est: something.domain.com et le UserDomainName ne renvoie que something.

36
Osvier

Pourquoi utilisez-vous WMI? Vous ne pouvez pas utiliser la fonctionnalité .NET standard?

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
91
Pieter van Ginkel

Je vais ajouter une réponse pour essayer de clarifier certaines choses car il semble y avoir une certaine confusion. Le problème principal est que les gens posent la mauvaise question, ou du moins ne sont pas assez précis.

Que signifie réellement le "domaine" d'un ordinateur ?

Lorsque nous parlons du "domaine" d'un ordinateur, nous pouvons faire référence à plusieurs choses. Ce qui suit n'est pas une liste exhaustive, mais il couvre les cas les plus courants:

  • Un tilisateur ou principal de sécurité informatique peut appartenir à un domaine Active Directory.
  • Le suffixe de recherche DNS principal de la pile réseau peut être appelé "domaine" de l'ordinateur.
  • Un nom DNS qui résout l'adresse IP de l'ordinateur peut être appelé "domaine" de l'ordinateur.

Lequel je veux?

Cela dépend fortement de ce que vous essayez de faire. L'affiche originale de cette question recherchait le "domaine Active Directory" de l'ordinateur, ce qui signifie probablement qu'ils recherchent le domaine auquel appartient le principal de sécurité de l'ordinateur ou le principal de sécurité d'un utilisateur. Généralement, vous les souhaitez lorsque vous essayez de parler à Active Directory d'une manière ou d'une autre. Notez que le principal utilisateur actuel et le principal ordinateur actuel ne sont pas nécessairement dans le même domaine.

La réponse de Pieter van Ginkel est en fait de vous donner le suffixe DNS principal de la pile de réseau local (la même chose que celle montrée dans la section supérieure de la sortie de ipconfig /all). Dans le cas de 99%, c'est probablement le même que le domaine auquel appartiennent à la fois le principal de sécurité de l'ordinateur et le principal de l'utilisateur actuellement authentifié - mais pas nécessairement . En général, c'est ce que vous voulez lorsque vous essayez de parler à des périphériques sur le LAN, que les périphériques soient ou non liés à Active Directory. Pour de nombreuses applications, ce sera toujours une réponse "assez bonne" pour parler à Active Directory.

La dernière option, un nom DNS, est beaucoup plus floue et plus ambiguë que les deux autres. N'importe où entre les enregistrements DNS zéro et infini peut se résoudre en une adresse IP donnée - et il n'est même pas nécessairement clair quelle adresse IP vous intéresse. réponse de user2031519 fait référence à la valeur de HTTP_Host, qui est particulièrement utile pour déterminer comment l'utilisateur a résolu votre serveur HTTP afin d'envoyer la demande que vous êtes en train de traiter. Ce n'est presque certainement pas ce que vous voulez si vous essayez de faire quoi que ce soit avec Active Directory.

Comment les obtenir?

Domaine du principal de sécurité utilisateur actuel

This son Nice et simple, c'est ce que la réponse de Tim vous donne.

System.Environment.UserDomainName

Domaine du principal de sécurité informatique actuel

This est probablement ce que l'OP voulait, pour celui-ci, nous allons devoir demander à Active Directory à ce sujet.

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()

Celui-ci lancera un ActiveDirectoryObjectNotFoundException si la machine locale ne fait pas partie du domaine, ou si le contrôleur de domaine ne peut pas être contacté.

Suffixe DNS principal de la pile réseau

Ce est ce que Réponse de Pieter van Ginkel vous donne. Ce n'est probablement pas exactement ce que vous voulez, mais il y a de fortes chances que cela vous suffise - si ce n'est pas le cas, vous savez probablement déjà pourquoi.

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName

Nom DNS qui résout l'adresse IP de l'ordinateur

Celui-ci est délicat et il n'y a pas de réponse unique. Si c'est ce que vous recherchez, commentez ci-dessous et je serai heureux de discuter de votre cas d'utilisation et de vous aider à trouver la meilleure solution (et à développer cette réponse dans le processus).

23
DaveRandom

J'ai trouvé cette question par le titre. Si quelqu'un d'autre cherche la réponse sur la façon d'obtenir simplement le nom de domaine, utilisez la variable d'environnement suivante.

System.Environment.UserDomainName

Je sais que l'auteur de la question le mentionne, mais je l'ai raté au premier coup d'œil et j'ai pensé que quelqu'un d'autre pourrait faire de même.

Ce que la description de la question demande alors est le nom de domaine complet (FQDN) .

14
Tim

Je sais que c'est vieux. Je voulais juste vider ceci ici pour quiconque cherchait une réponse pour obtenir un nom de domaine. Ceci est en coordination avec la réponse de Peter. Il y a "un" bogue comme l'a déclaré Rich. Mais, vous pouvez toujours faire une solution simple pour cela. La façon dont je peux dire s'ils sont toujours sur le domaine ou non est de cingler le nom de domaine. S'il répond, continuez avec quoi que ce soit pour lequel j'avais besoin du domaine. En cas d'échec, j'abandonne et passe en mode "hors ligne". Méthode de chaîne simple.

 string GetDomainName()
    {
        string _domain = IPGlobalProperties.GetIPGlobalProperties().DomainName;

        Ping ping = new Ping();

        try
        {
            PingReply reply = ping.Send(_domain);

            if (reply.Status == IPStatus.Success)
            {
                return _domain;
            }
            else
            {
                return reply.Status.ToString();
            }
        }
        catch (PingException pExp)
        {
            if (pExp.InnerException.ToString() == "No such Host is known")
            {
                return "Network not detected!";
            }

            return "Ping Exception";
        }
    }
1
IamBatman

Si vous souhaitez que des utilisateurs spécifiques aient accès à tout ou partie de l'espace objet WMI, vous devez les autoriser comme indiqué ici . Notez que vous devez être exécuté en tant qu'administrateur pour effectuer ce réglage.

1
Steve Townsend
 protected void Page_Init(object sender, EventArgs e)
 {
   String hostdet = Request.ServerVariables["HTTP_Host"].ToString();
 }
0
user2031519