114 votes

Comment puis-je obtenir une liste d'utilisateurs à partir d'Active Directory?

Comment puis-je obtenir une liste d'utilisateurs à partir d'Active Directory? Est-il possible d'extraire un nom d'utilisateur, un prénom, un nom de famille? J'ai vu un message similaire où cela a été utilisé:

  PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
 

Je n'ai jamais rien fait avec Active Directory, donc je suis complètement perdu. Toute aide serait grandement appréciée!

241voto

Harvey Kwok Points 5508

Si vous êtes nouveau à Active Directory, je suggère que vous devez comprendre comment Active Directory stocke les données en premier.

Active Directory est en fait un serveur LDAP. Les objets stockés dans le serveur LDAP sont stockées hierachically. C'est très semblable à vous stockez vos fichiers dans votre système de fichiers. C'est pourquoi il a obtenu le nom de Directory server et Active Directory

Les conteneurs et objets Active Directory peut être spécifié par un distinguished name. Le nom unique est comme cela qu' CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com. Comme une tradition relationnel de la base de données, vous pouvez exécuter la requête à l'encontre d'un serveur LDAP. Il est appelé à la requête LDAP.

Il y a un certain nombre de façons d'exécuter une requête LDAP dans .NET. Vous pouvez utiliser DirectorySearcher de System,DirectoryServices ou SearchRequest de System.DirectoryServices.Protocol.

Pour votre question, puisque vous demander de trouver d'utilisateur principal objet plus précisément, je pense que la façon la plus intuitive consiste à utiliser PrincipalSearcher de System.DirectoryServices.AccountManagement. Vous pouvez facilement trouver beaucoup de différents exemples de google. Voici un exemple qui est en train de faire exactement ce que vous demandez.

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

Notez que sur l'ANNONCE de l'utilisateur de l'objet, il y a un certain nombre d'attributs. En particulier, givenName vous donnera l' First Name et sn vous donnera l' Last Name. Sur le nom de l'utilisateur. Je pense que vous avez voulu dire le nom de connexion utilisateur. Notez qu'il existe deux noms d'ouverture de session sur l'ANNONCE de l'utilisateur de l'objet. L'un est - samAccountName, qui est également connu comme le pré-Windows 2000, nom de connexion utilisateur. userPrincipalName est généralement utilisé après l'installation de Windows 2000.

24voto

apereira Points 21

Si vous voulez filtrer les comptes actifs, ajoutez ceci au code de Harvey:

  UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;
 

après la première utilisation. Puis ajouter

   searcher.QueryFilter = userPrin;
 

avant la trouver tout. Et cela devrait vous amener les actifs.

3voto

FreeAsInBeer Points 9791

Incluez le System.DirectoryServices.dll, puis utilisez le code ci-dessous:

 DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="<strong class="highlight">Users</strong> :  ";
foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);
 

1voto

Kumar Points 940

Oui, utilisez principalContext et GroupPrincipal pour rechercher l’identité. Voir l’avant-derniere - obtenir les noms d’utilisateur dans un groupe Active Directory via .net

0voto

kravits88 Points 1307
 net user /DOMAIN
 

Dans l'invite de commande vous les listera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X