2009-08-19 17 views
20

Devo creare un nuovo utente in Active Directory. Ho trovato diversi esempi come i seguenti:Crea utente di Active Directory in .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); 
     } 
     } 
    } 
} 

Quando si esegue questo codice non ottengo errori, ma nessun nuovo utente viene creato.

L'account su cui sto eseguendo il test dispone di privilegi sufficienti per creare un utente nell'unità organizzativa di destinazione.

Mi manca qualcosa (forse qualche attributo obbligatorio dell'oggetto utente)?

Qualche idea sul perché il codice non fornisce eccezioni?

EDIT
Di seguito ha lavorato per me:

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(); 

quindi c'erano in realtà un paio di problemi:

  1. CommitChanges deve essere chiamato user (grazie Rob)
  2. Il criterio password impediva all'utente di essere creato (grazie Marc)

risposta

16

Penso che si sta chiamando CommitChanges sul DirectoryEntry sbagliata.Nella documentazione di MSDN (http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx) si afferma quanto segue (il corsivo è da me)

è necessario chiamare il metodo CommitChanges sulla nuova voce per rendere la creazione permanente. Quando si chiama questo metodo, è possibile impostare valori di proprietà obbligatori sulla nuova voce. I provider hanno ciascuno requisiti diversi per le proprietà che devono essere impostate prima che venga effettuata una chiamata al metodo CommitChanges. Se tali requisiti non sono soddisfatti, il fornitore potrebbe generare un'eccezione. Rivolgersi al proprio fornitore per determinare quali proprietà devono essere impostate prima di confermare le modifiche.

Quindi, se si modifica il codice per user.CommitChanges() dovrebbe funzionare, se è necessario impostare più proprietà che solo il nome dell'account allora si dovrebbe ottenere un'eccezione.

Poiché al momento si sta chiamando CommitChanges() sull'unità organizzativa che non è stata modificata, non ci saranno eccezioni.

+0

Buona cattura !! :-) –

+1

il potere di leggere "manuali" in azione :) – balexandre

8

Assumendo che il percorso OU OU=x,DC=y,DC=com esiste davvero - dovrebbe funzionare :-)

cose da controllare:

  • si aggiunge un valore al "samAccountName" - perché non fare è sufficiente impostare il suo valore:

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

in caso contrario si potrebbe finire con recidere al samAccountNames - e che non funziona .....

  • che non stai impostando la proprietà userAccountControl a nulla - provare a utilizzare:

    user.Properties["userAccountControl"].Value = 512; // normal account 
    
  • avete più controller di dominio in la tua org? Se tu, e stai usando questo bind "server-less" (non specificando alcun server nel percorso LDAP), potresti essere sorpreso da dove viene creato l'utente :-) e ci vorranno diversi minuti fino a mezz'ora sincronizzare su tutta la rete

  • avete una politica di password rigorosa in atto? Forse è questo il problema Ricordo che dovevamo creare l'utente con l'opzione "non richiede password", prima fare un primo .CommitChanges(), quindi creare una password abbastanza potente, impostarla sull'utente e rimuovere l'opzione dell'utente.

Marc

0

Controllare il codice qui sotto

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

      } 
     } 
Problemi correlati