usuarios - Crear usuario de Active Directory en.NET(C#)
login c# (3)
Creo que estás llamando a CommitChanges en la entrada de directorio incorrecta. En la documentación de MSDN ( http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx ) dice lo siguiente (énfasis agregado por mí)
Debe llamar al método CommitChanges en la nueva entrada para que la creación sea permanente. Cuando llama a este método, puede establecer valores de propiedad obligatorios en la nueva entrada. Cada proveedor tiene requisitos diferentes para las propiedades que deben establecerse antes de que se realice una llamada al método CommitChanges. Si esos requisitos no se cumplen, el proveedor puede lanzar una excepción. Consulte con su proveedor para determinar qué propiedades deben establecerse antes de confirmar los cambios.
Por lo tanto, si cambia su código a user.CommitChanges () debería funcionar, si necesita establecer más propiedades que solo el nombre de la cuenta, debería obtener una excepción.
Dado que actualmente está llamando a CommitChanges () en la unidad organizativa que no se ha modificado, no habrá excepciones.
Necesito crear un nuevo usuario en Active Directory. He encontrado varios ejemplos como los siguientes:
using System;
using System.DirectoryServices;
namespace test {
class Program {
static void Main(string[] args) {
try {
string path = "LDAP://OU=x,DC=y,DC=com";
string username = "johndoe";
using (DirectoryEntry ou = new DirectoryEntry(path)) {
DirectoryEntry user = ou.Children.Add("CN=" + username, "user");
user.Properties["sAMAccountName"].Add(username);
ou.CommitChanges();
}
}
catch (Exception exc) {
Console.WriteLine(exc.Message);
}
}
}
}
Cuando ejecuto este código no aparece ningún error, pero no se crea ningún nuevo usuario.
La cuenta con la que estoy ejecutando la prueba tiene privilegios suficientes para crear un usuario en la unidad organizativa de destino.
¿Me falta algo (posiblemente algún atributo requerido del objeto de usuario)?
¿Alguna idea de por qué el código no da excepciones?
EDITAR
Lo siguiente me funcionó:
int NORMAL_ACCOUNT = 0x200;
int PWD_NOTREQD = 0x20;
DirectoryEntry user = ou.Children.Add("CN=" + username, "user");
user.Properties["sAMAccountName"].Value = username;
user.Properties["userAccountControl"].Value = NORMAL_ACCOUNT | PWD_NOTREQD;
user.CommitChanges();
Así que en realidad hubo un par de problemas:
-
CommitChanges
debe ser llamado enuser
(gracias Rob) - La política de contraseña estaba impidiendo que el usuario fuera creado (gracias Marc)
Revisa el siguiente código
DirectoryEntry ouEntry = new DirectoryEntry("LDAP://OU=TestOU,DC=TestDomain,DC=local");
for (int i = 3; i < 6; i++)
{
try
{
DirectoryEntry childEntry = ouEntry.Children.Add("CN=TestUser" + i, "user");
childEntry.CommitChanges();
ouEntry.CommitChanges();
childEntry.Invoke("SetPassword", new object[] { "password" });
childEntry.CommitChanges();
}
catch (Exception ex)
{
}
}
Suponiendo que su ruta OU=x,DC=y,DC=com
realmente existe, debería funcionar :-)
Cosas para comprobar:
está agregando un valor al "samAccountName", ¿por qué no configura su valor?
user.Properties["sAMAccountName"].Value = username;
De lo contrario, podría terminar con varios samAccountNames, y eso no funcionará ...
no está configurando la propiedad
userAccountControl
en nada; intente usar:user.Properties["userAccountControl"].Value = 512; // normal account
¿Tienes múltiples controladores de dominio en tu organización? Si usted, y está utilizando este enlace "sin servidor" (sin especificar ningún servidor en la ruta LDAP), podría sorprenderse de que el usuario se haya creado :-) y le llevará varios minutos hasta media hora. sincronizar en toda la red
¿Tiene una política de contraseña estricta en su lugar? Tal vez ese es el problema. Recuerdo que solíamos tener que crear el usuario con la opción "no requiere contraseña" primero, hacer un primer .CommitChanges (), luego crear una contraseña lo suficientemente poderosa, establecerla en el usuario y eliminar esa opción de usuario.
Bagazo