Este artículo explicará cómo usar VB.NET para realizar las manipulaciones más comunes en Active Directory (listado de usuarios, adición, modificación).
I. Introducción
La interacción entre VB.NET y Active Directory es cada vez más común. Muchas empresas y particulares buscan
utilizarlos para desarrollar aplicaciones de todo tipo.
Este artículo explicará las principales tareas que puede realizar con VB.NET y Active Directory: enumerar la información del usuario,
añadir usuario, modificar usuario, etc.
II. Introducción a Directorio Activo
Antes de comenzar a hablar sobre la codificación, echemos un vistazo a Active Directory para comprender qué es.
Active Directory es el servicio de directorio de Microsoft Windows 2000.
Se utiliza para administrar los recursos de la red: datos de usuario, impresoras, servidores, base de datos, grupos, computadoras
y políticas de seguridad.
Los usuarios no tienen que preocuparse por la estructura física de la red para acceder a estos recursos.
Active Directory simplifica la administración de la red al permitir el acceso a todos estos recursos desde un único punto
de administracion Otros beneficios son una estructura jerárquica flexible y escalabilidad que permite el almacenamiento
de millones de recursos.
Para conectarse al Directorio Activo, debe utilizar el protocolo de conexión LDAP (Lightweight Directory Access Protocol),
que es un protocolo de gestión de directorios de red.
III. tercero Active Directory y Visual Studio
Antes de que pueda usar los objetos necesarios para manipular Active Directory , debe agregar una referencia en Visual Studio:
System.DirectoryServices.dll
A continuación, recuerde agregar la referencia en las cláusulas de uso, haciendo:
Se agregó el espacio de nombres System.DirectoryServices
System.DirectoryServices.dll
Next, remember to add the reference in the using clauses, by doing:
Added the System.DirectoryServices namespace
Imports System.DirectoryServices
Una vez que haya hecho eso, puede pasar a la parte de codificación real y comenzar iniciando sesión en Active Directory.
IV. Conexión a Active Directory
Conectarse a un Active Directory es muy simple, posiblemente la parte más fácil de la codificación.
Para conectarse a Active Directory, debe usar el objeto DirectoryEntry.
El constructor de este objeto toma tres cadenas de caracteres como parámetros:
. la ruta al Directorio Activo (también llamado AD): esta ruta tiene la forma: LDAP://tu-nombre-AD;
. el nombre de usuario para la conexión (el usuario debe ser parte del AD);
. la contraseña correspondiente.
Así que deberías tener algo como esto:
Conectarse al Directorio Activo
try
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
Catch Ex As Exception
MessageBox.Show(Ex.Message)
End try
Si la cláusula Catch no detecta ningún error, significa que se ha conectado correctamente a Active Directory.
Por lo tanto, puede continuar con el resto del artículo, es decir, la lista de usuarios de Active Directory.
V. Lista de usuarios
Para enumerar los usuarios presentes en Active Directory, el principio es simple: navegamos por el AD y cada vez que encontramos un objeto de tipo usuario, mostramos la información deseada. Esa es la teoría, ¡ahora vamos a la práctica!
Para buscar AD, debe utilizar el objeto DirectorySearcher.
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
Dim searcher As DirectorySearcher = New DirectorySearcher (Ldap)
A continuación, debe especificar un filtro de búsqueda mediante la propiedad Filtro. En nuestro caso, solo queremos usuarios, por lo que escribimos:
Filtrado de usuarios
searcher.Filter = "(objectClass=user)"
El objeto DirectorySearcher tiene dos métodos principales para buscar:
FindOne(), que devolverá el primer objeto que coincida con los criterios de búsqueda;
FindAll(), que devuelve todos los registros que coinciden con los criterios de búsqueda.
Queremos enumerar todos los usuarios, por lo que usaremos el método FindAll():
Realizamos un bucle para recuperar y mostrar la información deseada.
Dim DirEntry As DirectoryEntry
For Each result As SearchResult In searcher.FindAll
// We retrieve the entry found during the search
DirEntry = result.GetDirectoryEntry
//We can now display the desired information
Console.WriteLine("Login: " + DirEntry.Properties("SAMAccountName").Value)
Console.WriteLine("Name: " + DirEntry.Properties("sn").Value)
Console.WriteLine("First Name: " + DirEntry.Properties("givenName").Value)
Console.WriteLine("Email: " + DirEntry.Properties("mail").Value)
Console.WriteLine("Tel: " + DirEntry.Properties("TelephoneNumber").Value)
Console.WriteLine("Description: " + DirEntry.Properties("description").Value)
Console.WriteLine("-------------------")
Next
Este código le permite acceder a información diversa sobre cada usuario contenida en Active Directory.
Solo he limitado la visualización aquí a estos valores, pero puede agregar otros, como la dirección,
la empresa, etc
VI. Editar un usuario
Editar un usuario es tan fácil como ver usuarios. De hecho, para modificarlo, solo necesita encontrarlo en Active Directory (lo que vio en el capítulo anterior).
Entonces solo necesita cambiar el valor del filtro de búsqueda y usar el método FindOne(), en lugar de FindAll(), ya que se supone que solo desea modificar la información de un usuario.
Así que volvamos a nuestro código:
Modificar un usuario
// Connect to the directory
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
// New object to instantiate the search
Dim searcher As DirectorySearcher = New DirectorySearcher (Ldap))
// We modify the filter to only search for the user whose login name is TEST
searcher.Filter = "(SAMAccountName=TEST)"
// No foreach loop because we are only looking for a user
Dim result As SearchResult = searcher.FindOne()
// We retrieve the object found during the search
Dim DirEntry As DirectoryEntry = result.GetDirectoryEntry()
// We modify the description property of the user TEST
DirEntry.Properties("description").Value = "New description for TEST"
// And his phone number
DirEntry.Properties("TelephoneNumber").Value = "0123456789"
// Send changes to Active Directory
DirEntry.CommitChanges()
Explicaciones del código:
Comenzamos conectándonos al directorio LDAP. Luego, usamos un objeto DirectorySearcher sobre el cual aplicamos
el filtro apropiado: solo queremos el usuario cuyo inicio de sesión es TEST, por lo tanto, cuyo SAMAccountName=TEST.
Entonces comienza la búsqueda.
Una vez que haya encontrado el primer objeto coincidente, lo recupera y luego puede modificar sus atributos.
Finalmente, la llamada a CommitChanges() envía los cambios al servidor de Active Directory.
VIII. Agregar un usuario
Para agregar un usuario, es un poco el mismo principio:
. conexión a Active Directory;
. creación de un nuevo objeto;
. establecer las propiedades del objeto;
. enviar cambios al servidor.
Entonces, veamos cómo se ve esto en términos de código:
Agregar usuario
// Connect to the directory
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
// Create the user Test User and initialize its properties
Dim user As DirectoryEntry = Ldap.Children.Add("cn=Test User", "user")
user.Properties("SAMAccountName").Add("testuser")
user.Properties("sn").Add("User")
user.Properties("givenName").Add("Test")
user.Properties("description").Add("Test account created by code")
// We send the modifications to the server
user.CommitChanges()
// We are now going to define his password. The user must have been created
// and saved before you can do this step
user. Invoke("SetPassword", new object () {"password"})
// We will now activate the account: ADS_UF_NORMAL_ACCOUNT
user.Properties["userAccountControl"].Value = 0x0200
// We send the modifications to the server
user.CommitChanges()
Explicaciones del código:
Aquí nos conectamos al Directorio Activo, luego indicamos que vamos a agregar un nodo hijo por medio de Children.Add, el cual toma como parámetro:
. el nombre de la nueva entrada;
. el esquema (tipo) de la nueva entrada. En nuestro caso, es un usuario, por lo que usuario en inglés.
Luego, definimos las propiedades del usuario, utilizando el método Add: su nombre de inicio de sesión (SAMAccountName), su nombre, su nombre y su descripción.
Una vez hecho esto, llamamos a CommitChanges() para enviar los cambios (en nuestro caso, una adición) de vuelta al servidor.
Luego, usamos el método Invoke para establecer la contraseña del usuario. Antes de que podamos usar este método, debemos asegurarnos de que el usuario existe en AD, de ahí la llamada anterior a CommitChanges().
Finalmente, definimos el tipo de cuenta que queremos, usando la propiedad userAccountControl: queremos una cuenta simple, por lo que debemos usar la constante adecuada.
Aquí está la lista de constantes:
Value Effect
const long ADS_UF_SCRIPT = 0x0001; The startup script will be executed
const long ADS_UF_ACCOUNTDISABLE = 0x0002; Disable Account
const long ADS_UF_HOMEDIR_REQUIRED = 0x0008; Requires root directory
const long ADS_UF_LOCKOUT = 0x0010; Account is locked
const long ADS_UF_PASSWD_NOTREQD = 0x0020; No password needed
const long ADS_UF_PASSWD_CANT_CHANGE = 0x0040; User cannot change password
const long ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x0080; PDM encryption allowed
const long ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x0100; Local user account
const long ADS_UF_NORMAL_ACCOUNT = 0x0200; Classic account
Puede encontrar esta lista (junto con ejemplos) aquí:
Finalmente, una última llamada a CommitChanges() envía los últimos cambios/adiciones realizados al usuario al servidor.
Eso es todo, ha creado con éxito el usuario Usuario de prueba cuyo nombre de inicio de sesión es testuser y cuyo
Las propiedades son las que ha definido anteriormente.
VIII. Conclusión
Aquí hemos visto, a lo largo de este artículo, las principales operaciones que puede necesitar realizar si utiliza
Active Directory junto con VB.NET.
Por supuesto, este artículo no es exhaustivo: se pueden realizar otras operaciones, tanto sobre grupos como sobre usuarios .
pero me he contentado con ir a lo esencial y a lo que podría interesar al mayor número
de desarrolladores: ¿por qué no una continuación en un artículo futuro?
Mientras tanto, espero que hayas disfrutado leyendo este y te digo: