Jak Mogę uzyskać listę użytkowników z usługi Active directory?

Jak mogę uzyskać listę użytkowników z usługi Active directory? Czy istnieje sposób na wyciągnięcie nazwy użytkownika, imienia i nazwiska? Widziałem podobny post, w którym to zostało użyte:

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

Nigdy nie robiłem nic z Active directory, więc jestem całkowicie zagubiony. Każda pomoc będzie bardzo mile widziana!

Author: leppie, 2011-03-02

4 answers

Jeśli jesteś nowy w Active Directory, sugeruję, abyś najpierw zrozumiał, jak Active Directory przechowuje dane.

Active Directory jest w rzeczywistości serwerem LDAP. Obiekty przechowywane na serwerze LDAP są przechowywane hierarchicznie. Jest to bardzo podobne do przechowywania plików w systemie plików. Dlatego ma nazwę Katalog serwer i aktywny Katalog

Kontenery i obiekty w Active Directory mogą być określone przez distinguished name. Nazwa wyróżniająca jest jak to CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com. Podobnie jak tradycyjna relacyjna baza danych, można uruchamiać zapytania na serwerze LDAP. To się nazywa zapytanie LDAP.

Istnieje wiele sposobów na uruchomienie zapytania LDAP w .NET. możesz użyć DirectorySearcher Z System.DirectoryServices lub SearchRequest Z System.DirectoryServices.Protocol.

Dla Twojego pytania, ponieważ prosisz o znalezienie głównego obiektu użytkownika, myślę, że najbardziej intuicyjnym sposobem jest użyciePrincipalSearcher z System.DirectoryServices.AccountManagement. Można łatwo znaleźć wiele różnych przykładów z google. Oto próbka, która robi dokładnie to, o co prosisz.

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

Zauważ, że na obiekcie użytkownika AD Znajduje się wiele atrybutów. W szczególności givenName da ci First Name, a sn da ci Last Name. O nazwie użytkownika. Chyba chodziło Ci o nazwę logowania użytkownika. Zauważ, że na obiekcie AD user znajdują się dwie nazwy logowania. Jedną z nich jest samAccountName, która jest również znana jako nazwa logowania użytkownika przed Windows 2000. userPrincipalName jest zwykle używany po Windows 2000.

 185
Author: Harvey Kwok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-07 19:44:11

Jeśli chcesz filtrować aktywne konta y dodaj to do kodu:

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

Po pierwszym użyciu. Następnie dodaj

  searcher.QueryFilter = userPrin;

Przed znalezieniem wszystkich. I to powinno dać ci tych aktywnych.

 19
Author: apereira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 20:10:07

Z pewnością zasługa @Harvey Kwok tutaj, ale chciałem tylko dodać ten przykład, ponieważ w moim przypadku chciałem uzyskać rzeczywistą listę UserPrincipals. Prawdopodobnie bardziej wydajne jest filtrowanie tego zapytania z góry, ale w moim małym środowisku łatwiej jest wyciągnąć wszystko, a następnie filtrować w razie potrzeby później z mojej listy.

W zależności od tego, czego potrzebujesz, może nie być konieczne cast do DirectoryEntry, ale niektóre właściwości nie są dostępne w UserPrincipal.

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}
 3
Author: Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 20:59:11

Include the System.DirectoryServices.dll, następnie użyj poniższego kodu:

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="Users: ";

foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);
 2
Author: FreeAsInBeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 21:52:23