¿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á muy apreciada!
c#
asp.net
.net
active-directory
Miguel
fuente
fuente
Respuestas:
Si es nuevo en Active Directory, le sugiero que primero comprenda cómo Active Directory almacena los datos.
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 obtuvo el nombre de servidor de directorio y Active Directory
Los contenedores y objetos de Active Directory se pueden especificar mediante un
distinguished name
. El nombre distinguido es asíCN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com
. Como una base de datos relacional tradicional, puede ejecutar consultas en un servidor LDAP. Se llama consulta LDAP.Hay varias formas de ejecutar una consulta LDAP en .NET. Puede utilizar DirectorySearcher desde
System.DirectoryServices
o SearchRequest desdeSystem.DirectoryServices.Protocol
.Para su pregunta, dado que está pidiendo encontrar el objeto principal del usuario específicamente, creo que la forma más intuitiva es usar PrincipalSearcher de
System.DirectoryServices.AccountManagement
. Puede encontrar fácilmente muchos ejemplos diferentes en Google. Aquí hay una muestra que hace exactamente lo que está pidiendo.Tenga en cuenta que en el objeto de usuario de AD, hay varios atributos. En particular,
givenName
le dará elFirst Name
ysn
le dará elLast Name
. Sobre el nombre de usuario. Creo que te refieres al 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 de AD. Uno essamAccountName
, que también se conoce como nombre de inicio de sesión de usuario anterior a Windows 2000.userPrincipalName
se utiliza generalmente después de Windows 2000.fuente
if (((UserPrincipal)result).EmailAddress != null)
antes de agregar el resultado a mi lista.Si desea filtrar y cuentas activas agregue esto al código de Harvey:
después del primer uso. Luego añade
antes de encontrar todo. Y eso debería darte los activos.
fuente
searcher.QueryFilter = userPrin;
, ya que ya pasamos el principal del usuario al buscador principal en la inicialización, pero de lo contrario, ¡gracias por el consejo sobre el filtrado de usuarios activos solamente!using (var searcher = new PrincipalSearcher(new UserPrincipal(context){ Enabled = true }))
Enabled
primero tenías que probar si tenía un valor:if (userPrincipal.Enabled.HasValue)
Ciertamente, el crédito es para @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 pequeño entorno, es más fácil extraer todo y luego filtrar según sea necesario de mi lista.
Dependiendo de lo que necesite, es posible que no necesite convertir a DirectoryEntry, pero algunas propiedades no están disponibles en UserPrincipal.
fuente
Incluya System.DirectoryServices.dll, luego use el siguiente código:
fuente