2009-08-19 107 views
20

Necesito crear un nuevo usuario en Active Directory. He encontrado varios ejemplos como el siguiente:Crear usuario de Active Directory en .NET (C#)

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 el código me sale ningún error, pero no se crea un nuevo usuario.

La cuenta con la que estoy realizando la prueba tiene los 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
Los siguientes trabajó para mí:

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 había un par de problemas:

  1. CommitChanges debe ser llamado en user (gracias Rob)
  2. La política de contraseñas impedía la creación del usuario (gracias Marc)

Respuesta

16

Creo que está llamando CommitChanges en la DirectoryEntry mal.En la documentación de MSDN (http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx) se afirma lo siguiente (énfasis añadido por mí)

debe llamar al método CommitChanges en la nueva entrada para hacer la creación permanente. Cuando llama a este método, puede establecer valores de propiedad obligatorios en la nueva entrada. Los proveedores tienen diferentes requisitos para las propiedades que deben establecerse antes de realizar una llamada al método CommitChanges. Si no se cumplen esos requisitos, el proveedor puede lanzar una excepción. Consulte con su proveedor para determinar qué propiedades deben establecerse antes de realizar cambios.

Así que si cambia el código para user.CommitChanges() debe trabajar, si es necesario establecer más propiedades que sólo el nombre de la cuenta entonces usted debe conseguir una excepción.

Como actualmente llama a CommitChanges() en la OU que no ha sido alterado, no habrá excepciones.

+0

Buena captura !! :-) –

+1

el poder de leer "manuales" en acción :) – balexandre

8

Asumiendo que su ruta OU OU=x,DC=y,DC=com realmente existe - que debería funcionar :-)

cosas para comprobar:

  • va a añadir un valor a la "samAccountName" - ¿por qué no hacer que acaba de establecer su valor:

    user.Properties["sAMAccountName"].Value = username; 
    

de lo contrario podría terminar con cortar Al samAccountNames - y que no va a funcionar .....

  • usted no está estableciendo la propiedad userAccountControl a cualquier cosa - trate de usar:

    user.Properties["userAccountControl"].Value = 512; // normal account 
    
  • ¿tiene múltiples controladores de dominio tu org? Si usted, y está usando este enlace "sin servidor" (sin especificar ningún servidor en la ruta LDAP), podría sorprenderse dónde se crea el usuario :-) y le tomará varios minutos hasta media hora para sincronizar en toda la red

  • ¿tiene usted una política de contraseña estricta? Tal vez ese es el problema. Recuerdo que antes teníamos que crear al usuario con la opción "no requiere contraseña" primero, hacer un primer .CommitChanges(), luego crear una contraseña lo suficientemente potente, configurarla en el usuario y eliminar esa opción de usuario.

Marc

0

Comprobar el código de abajo

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) 
      { 

      } 
     } 
Cuestiones relacionadas