Comment savoir quel ordinateur est le contrôleur de domaine dans Windows par programmation?

102

Je recherche un moyen de déterminer quel est le nom / l'adresse IP du contrôleur de domaine pour un domaine donné auquel un ordinateur client est connecté.

Dans notre entreprise, nous avons beaucoup de petits petits réseaux que nous utilisons pour tester et la plupart d'entre eux ont leurs propres petits domaines. A titre d'exemple, l'un des domaines est nommé "TESTLAB". J'ai un poste de travail Windows XP qui est membre du domaine TESTLAB et j'essaie de comprendre le nom du contrôleur de domaine afin que je puisse aller voir quels utilisateurs ont été définis pour le domaine. Dans notre laboratoire, il y a un mélange de Windows Server 2000 et Windows Server 2003 (et en réalité probablement deux serveurs NT 4), il serait donc bien de trouver une solution qui fonctionnerait pour les deux.

En regardant sur Internet, il semble qu'il existe divers utilitaires, tels que Windows Power Shell ou nltest, mais ceux-ci nécessitent tous que vous téléchargiez et installiez d'autres utilitaires. J'espérais trouver un moyen de trouver le contrôleur de domaine sans avoir à installer quoi que ce soit de plus.

MODIFIER Si je voulais écrire un programme pour trouver le contrôleur de domaine ou les utilisateurs du domaine actuel, comment procéderais-je?

Ingénieur Dorky
la source
Depuis que j'ai passé un peu de temps à écrire une solution pour cela, j'ai pensé en faire une question de programmation et la rouvrir.
tvanfosson

Réponses:

253

Avec le langage de programmation le plus simple: DOS batch

echo %LOGONSERVER%
MZywitza
la source
Probablement pas ce que Dorky avait en tête à l'époque, mais quand même, probablement ce que la plupart des lecteurs du fil recherchent. hein ... c'était ce que Dorky cherchait. Hah!
andersoyvind
3
Cela ne fonctionnera pas si vous recherchez un contrôleur de domaine dans un autre domaine auquel la machine n'appartient pas.
Brett Veenstra
@DorkyEngineer que diriez-vous de marquer ceci comme votre réponse sélectionnée?
ErikE
20

Dans cmd sous Windows, tapez la commande suivante:

nltest /dclist:{domainname}

Il répertorie tous les contrôleurs de domaine dans un domaine particulier

Lado Morela
la source
3
et nltest /dclist:répertorie tous les contrôleurs sur n'importe quel domaine
auquel
12

En C # /. NET 3.5, vous pouvez écrire un petit programme à faire:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
    string controller = context.ConnectedServer;
    Console.WriteLine( "Domain Controller:" + controller );
} 

Cela listera tous les utilisateurs du domaine actuel:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
    using (UserPrincipal searchPrincipal = new UserPrincipal(context))
    {
       using (PrincipalSearcher searcher = new PrincipalSearcher(searchPrincipal))
       {
           foreach (UserPrincipal principal in searcher.FindAll())
           {
               Console.WriteLine( principal.SamAccountName);
           }
       }
    }
}
Tvanfosson
la source
7

À partir de la ligne de commande, interrogez la variable d'environnement logonserver.

C:> SET L

LOGONSERVER = '\' \ DCNAME

Sri
la source
6

Exécutez gpresultà une invite de commande Windows. Vous obtiendrez une abondance d'informations sur le domaine actuel, l'utilisateur actuel, les groupes de sécurité des utilisateurs et des ordinateurs, les noms de stratégie de groupe, le nom distinctif d'Active Directory, etc.

ErikE
la source
J'ai dû utiliser l'argument "/ R" pour obtenir le rapport.
Josiah
Vous devriez essayer gpresult /Z!!
ErikE
Quel est l'avantage de / Z? Aux fins de la détermination du DC utilisé, ils semblent comparables.
Josiah
1
Les gens pourraient aimer être dirigés vers l'option en raison de la richesse des informations disponibles. Mais vous avez raison, pour JUSTE le DC utilisé, d'autres options sont plus succinctes.
ErikE
2

dans Powershell: $ env: logonserver

Wim
la source
0

Pour récupérer les informations lorsque le DomainControllerexiste dans un domaine auquel votre machine n'appartient pas, vous avez besoin de quelque chose de plus.

  DirectoryContext domainContext =  new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword");

  var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext);
  var controller = domain.FindDomainController();
Brett Veenstra
la source