c# - single - ¿Cómo puedo obtener una lista de usuarios del directorio activo?
single sign on c# active directory (4)
Ciertamente, el crédito va a @Harvey Kwok aquí, pero solo quería agregar este ejemplo porque en mi caso quería obtener una lista real de UserPrincipals. Probablemente sea más eficiente filtrar esta consulta por adelantado, pero en mi entorno pequeño, es más fácil extraer todo y luego filtrar según sea necesario más adelante de mi lista.
Dependiendo de lo que necesite, es posible que no tenga que enviar contenido a DirectoryEntry, pero algunas propiedades no están disponibles en 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)e.GetUnderlyingObject();
Console.WriteLine(d.Properties["GivenName"].Value.ToString() + d.Properties["sn"].Value.ToString());
}
}
¿Cómo puedo obtener una lista de usuarios del directorio activo? ¿Hay alguna forma de extraer nombre de usuario, nombre, apellido? Vi una publicación similar donde se usó esto:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
Nunca he hecho nada con el directorio activo, así que estoy completamente perdido. ¡Cualquier ayuda sería muy apreciada!
Incluya el System.DirectoryServices.dll, luego use el siguiente código:
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);
Si desea filtrar las cuentas activas, agregue esto al código de Harvey:
UserPrincipal userPrin = new UserPrincipal(context);
userPrin.Enabled = true;
después del primer uso. Luego añade
searcher.QueryFilter = userPrin;
antes de encontrar todo. Y eso debería hacerte los activos.
Si es nuevo en Active Directory, le sugiero que debe comprender cómo Active Directory almacena datos primero.
Active Directory es en realidad un servidor LDAP. Los objetos almacenados en el servidor LDAP se almacenan jerárquicamente. Es muy similar a almacenar sus archivos en su sistema de archivos. Es por eso que tiene el nombre de servidor de directorio y Active Directory
Los contenedores y objetos en Active Directory se pueden especificar con un distinguished name
. El nombre CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com
es como este CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com
. Al igual que una base de datos relacional tradicional, puede ejecutar consultas en un servidor LDAP. Se llama consulta LDAP.
Hay varias maneras de ejecutar una consulta LDAP en .NET. Puede usar DirectorySearcher desde System.DirectoryServices
o SearchRequest desde System.DirectoryServices.Protocol
.
Para su pregunta, ya que está pidiendo encontrar un objeto principal de usuario específicamente, creo que la forma más intuitiva es utilizar PrincipalSearcher desde System.DirectoryServices.AccountManagement
. Puede encontrar fácilmente muchos ejemplos diferentes de google. Aquí hay una muestra que está haciendo exactamente lo que está pidiendo.
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();
Tenga en cuenta que en el objeto de usuario AD, hay una serie de atributos. En particular, givenName
le dará el First Name
y sn
le dará el Last Name
. Sobre el nombre de usuario. Creo que quisiste decir el nombre de inicio de sesión del usuario. Tenga en cuenta que hay dos nombres de inicio de sesión en el objeto de usuario AD. Uno es samAccountName
, que también se conoce como nombre de inicio de sesión de usuario anterior a Windows 2000. userPrincipalName
generalmente se usa después de Windows 2000.