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!
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.
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.
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());
}
}
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);
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