Consultar información de usuario desde Active Directory en C#
-
Use el espacio de nombres
System.DirectoryServices
en C# para consultar la información del usuario desde Active Directory -
Use el espacio de nombres
System.DirectoryServices.AccountManagement
en C# para consultar la información del usuario desde Active Directory -
Combine
System.DirectoryServices
ySystem.DirectoryServices.AccountManagement
para acceder a propiedades no expuestas por las bibliotecasAccountManagement
Recuperar la información del usuario de Active Directory puede ser un desafío, ya que algunas de las herramientas de línea de comandos y MSAD son bastante limitadas y difíciles de usar. Por otro lado, escribir su código C# es más gratificante y personalizable.
Hay dos conjuntos de clases para operaciones de AD para consultar información en C#. El primero usa el espacio de nombres System.DirectoryServices
y es más fácil de usar.
Sin embargo, no es tan versátil como el segundo que presenta el espacio de nombres System.DirectoryServices.AccountManagement
.
Use el espacio de nombres System.DirectoryServices
en C# para consultar la información del usuario desde Active Directory
System.DirectoryServices
es una forma técnica de permitirle acceder a cualquier información de usuario desde Active Directory. Las propiedades de los objetos AD
(ya que son todos objetos genéricos) se mantienen en una matriz que contiene toda la información del usuario.
Este método es mucho más críptico y orientado a los detalles. A menudo requiere que los desarrolladores configuren manualmente los códigos UAC
para consultar la información del usuario de Active Directory.
El siguiente código ejecutable le mostrará cómo usar Active Directory para consultar la información del usuario en C#.
using System;
using System.Text;
using System.DirectoryServices;
namespace queryInfoAD {
class userActiveDirectory {
static void Main(string[] args) {
// Input the user name (password can also be required) to get a particular user info from
// Active Directory
Console.Write("User Name = ");
String searchUsername = Console.ReadLine();
try {
// create an LDAP connection object that will help you fetch the Active Directory user
DirectoryEntry userLdapConn = createDirectoryEntry();
// create `ObjSearch` as a search object which operates on an LDAP connection object to only
// find a single user's details
DirectorySearcher ObjSearch = new DirectorySearcher(userLdapConn);
ObjSearch.Filter = searchUsername;
// create result objects from the search object
SearchResult checkUser = ObjSearch.FindOne();
if (checkUser != null) {
ResultPropertyCollection fields = checkUser.Properties;
foreach (String ldapUser in fields.PropertyNames) {
foreach (Object InfoChart in fields[ldapUser])
Console.WriteLine(String.Format("{0,-20} : {1}", ldapUser, InfoChart.ToString()));
}
}
else {
Console.WriteLine("User does not exist!");
}
}
catch (Exception e) {
Console.WriteLine("Error!\n\n" + e.ToString());
}
}
static DirectoryEntry createDirectoryEntry() {
// create an LDAP connection with custom settings and return it
DirectoryEntry ldapConnection = new DirectoryEntry("Insert connection domain link...");
ldapConnection.Path =
"Insert the path to the Active Directory which contains user information";
ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
return ldapConnection;
}
}
}
System.DirectoryServices
brinda fácil acceso al directorio activo desde el código administrado. El objeto de búsqueda
de DirectorySearcher
ayuda a limitar la búsqueda a un solo usuario con un nombre de usuario común.
Puede acotar aún más su consulta LDAP introduciendo un método dSearcher.Filter
, que puede buscar a un usuario en particular para obtener información interesante. Además, no olvide deshacerse de los objetos DirectoryEntry
y DirectorySearcher
ya que pertenecen al espacio de nombres System.DirectoryServices
.
Use el espacio de nombres System.DirectoryServices.AccountManagement
en C# para consultar la información del usuario desde Active Directory
Su objetivo principal es administrar Active Directory a través de .NET mucho más fácil. Es el enfoque más nuevo para recuperar información de usuario del directorio activo y puede realizar prácticamente todas las operaciones de AD.
Este método permite a los desarrolladores utilizar comandos como user.DisplayName
y user.VoiceTelephoneNumber
, que ayuda a consultar un conjunto personalizado de información de usuario de Active Directory.
using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
// add the reference in the `System.DirectoryServices.AccountManagement` library to your project
// before executing this code
namespace DSAM_examp {
class AccManagement {
static void Main(string[] args) {
try {
// enter Active Directory settings
PrincipalContext ActiveDirectoryUser =
new PrincipalContext(ContextType.Domain, "Insert the domain link here...");
// create search user and add criteria
Console.Write("Enter User Name: ");
UserPrincipal userName = new UserPrincipal(ActiveDirectoryUser);
userName.SamAccountName = Console.ReadLine();
PrincipalSearcher search = new PrincipalSearcher(userName);
foreach (UserPrincipal result in search.FindAll())
// the user information in AD contains the VoiceTelephoneNumber that is unique and helps
// find the target user
// result.VoiceTelephoneNumber != null is also valid
if (result.DisplayName != null) {
// to display the user name and telephone number from Active Directory. You can also
// retrieve more information using similar commands.
Console.WriteLine(result.DisplayName, result.VoiceTelephoneNumber);
}
search.Dispose();
}
catch (Exception error) {
Console.WriteLine("User not found! Error: " + error.Message);
}
}
}
}
Puede usar UserPrincipal.FindByIdentity
como una clase del espacio de nombres System.DirectoryServices.AccountManagement
, que es la forma más sencilla de consultar la información del usuario, pero también la más lenta.
Al eliminar el método SamAccountName
y la entrada manual del nombre de usuario, puede consultar la información de todos los usuarios en Active Directory.
Combine System.DirectoryServices
y System.DirectoryServices.AccountManagement
para acceder a propiedades no expuestas por las bibliotecas AccountManagement
Se puede acceder a las propiedades que las bibliotecas AccountManagement
no exponen convirtiendo UserPrincipal
en un objeto más general.
Al recuperar objetos subyacentes de UserPrincipal
en Active Directory, ambos espacios de nombres DirectoryServices
juegan un papel importante.
using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
namespace HybridMethod {
class getUserInfo {
static void Main(string[] args) {
try {
PrincipalContext userActiveDirectory =
new PrincipalContext(ContextType.Domain, "Insert your domain link here...");
// `UserPrincipal` class encapsulates principals that contain user information
UserPrincipal userName = new UserPrincipal(userActiveDirectory);
// retrieves the principal context that is essential to perform the query. Its context
// specifies the server/domain against which search operations are performed.
PrincipalSearcher searchObj = new PrincipalSearcher(userName);
foreach (UserPrincipal result in searchObj.FindAll()) {
if (result.DisplayName != null) {
// access the underlying object, e.g., user properties
DirectoryEntry lowerLdap = (DirectoryEntry)result.GetUnderlyingObject();
Console.WriteLine("{0,30} {1} {2}", result.DisplayName,
lowerLdap.Properties["postofficebox"][0].ToString());
}
}
// disposing the `PrincipalSearcher` object
searchObj.Dispose();
}
catch (Exception exp) {
Console.WriteLine(exp.Message);
}
}
}
}
En este tutorial, aprendió tres formas de consultar la información del usuario de Active Directory en C#. Con el tercer método híbrido, incluso puede obtener propiedades de usuario oscuras.
Estos métodos le ofrecen varias ventajas, como legibilidad y brevedad, y son extremadamente útiles para obtener toda o una parte de la información del usuario de Active Directory de forma más rápida y sencilla.
Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.
GitHub