Tipps und Tricks rund um .NET und Visual Studio

Kolumne .NETversum: Windows-Benutzerkonten anlegen
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne “.NETversum” ihr Expertenwissen rund um .NET-Tools und WPF mit.

Ein neues Benutzerkonto anlegen

Einige Anwendungen möchten neue Windows-Benutzerkonten anlegen, z. B. als Dienstkonten. Diese Aufgabe lässt sich mit der COM-Komponente Active Directory Service Interface (ADSI) und dem darauf aufbauenden System.DirectoryServices.dll aus der .NET-Framework-Klassenbibliothek bzw. der wiederum darauf aufbauenden System.DirectoryServices.AccountManagement.dll lösen. System.DirectoryServices.dll gibt es ab .NET 1.0, System.DirectoryServices.AccountManagement.dll erst ab .NET 3.5.

Der nachfolgende Programmcode verwendet die Assembly System.DirectoryServices.AccountManagement.dll. Voraussetzung für diesen Programmcode ist naturgemäß, dass er unter einem administrativen Benutzerkonto läuft, das die Rechte zum Anlegen eines Benutzerkontos hat.

Zunächst gilt es, einen PrincipalContext zu instanziieren unter Angabe der zu erweiternden Benutzerdatenbank. Dies kann eine lokale Benutzerdatenbank sein (ContextType.Machine) oder ein Microsoft Active Directory (ContextType.Domain). Als zweiter Parameter ist der Rechnername anzugeben. Im Fall des Active Directory ist dies ein Domänencontroller. Die Angabe kann aber leer sein. Der dritte Parameter muss bei lokalen Benutzerdatenbanken leer bleiben; beim Active Directory ist hier der Container anzugeben.

Im zweiten Schritt ist dann ein UserPrincipal-Objekt unter Angabe der PrincipalContext-Instanz im Konstruktor anzulegen. Dieses Objekt befüllt man nun mit den gewünschten Werten. Am Ende ruft man Save() zum Speichern des neuen Benutzerskonto auf.

Pflichtangabe ist entweder der Verzeichnisname (Name) oder der Anmeldename (SamAccountName). Wenn beide fehlen, kommt zum Glück eine aussagekräftige Fehlermeldung: „SamAccountName or Name must be assigned to a newly-created Principal object in this store prior to saving.“ Leider nicht so intuitive ist die Fehlermeldung „There is no such object on the server.“, die beim Setzen der ersten Eigenschaft auftreten kann. Auf den ersten Blick muss man sich wundern, denn natürlich ist das Benutzerkonto noch nicht da – man will es ja schließlich anlegen. Die Meldung bezieht sich aber gar nicht auf das Benutzerkonto, sondern den Container. Diese Meldung erscheint, wenn es den bei der Instanziierung des PrincipalContext angegebenen LDAP-Pfad des Containers (z. B. die Organisationseinheit) nicht gibt.

In Listing 1 finden Sie den ganzen Programmcode, in dem zahlreiche Eigenschaften des Benutzers gesetzt werden.

   // Auf den Standort des neuen Benutzerkontos zugreifen
   PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "DC03", "OU=test,DC=IT-
      Visions,DC=local");
   // Benutzerobjekt erzeugen
   UserPrincipal b = new UserPrincipal(ctx);
   // Daten des Benutzerkontos setzen 
 
   // Technische Namen des Benutzerskontos
   b.Name = "HSchwichtenberg"; // Verzeichnisname
   b.SamAccountName = "HSchwichtenberg"; // Anmeldename
   b.UserPrincipalName = "HSchwichtenberg@IT-Visions.de"; // UPN
 
   // Reale Namen
   b.GivenName = "Holger";
   b.Surname = "Schwichtenberg";
   b.DisplayName = "Dr. Holger Schwichtenberg";
 
   // Weitere Daten
   b.EmployeeId = "007";
   b.Description = "Softwarearchitekt, Dozent, Autor";
 
   // Kommunikationsdaten
   b.EmailAddress = "HSchwichtenberg@IT-Visions.de";
   b.VoiceTelephoneNumber = "+49 201 649590-0";
 
   // Konfigurationseinstellungen
   b.HomeDirectory = @"\\FileServer\Home\HS";
   b.HomeDrive = "d:";
   b.ScriptPath = @"\\FileServer\Scripts\logon.bat";
 
   // Kennwort festlegen
   b.SetPassword("Sehr+Geheim");
   // Kennworteigenschaften festlegen
   b.ExpirePasswordNow();
 
   // Konto aktivieren
   b.Enabled = true;
   // Neues Benutzerkonto nun speichern
   b.Save();

Der Aufruf von ExpirePasswordNow() sorgt für ein temporäres Kennwort, dass der Benutzer bei der nächsten Anmeldung ändern muss. Wenn man stattdessen ein nie ablaufendes, nicht änderbares Kennwort will, setzt man

u.PasswordNeverExpires = true; 

und

u.UserCannotChangePassword = true;

Leider können nicht alle Eigenschaften des Benutzerskonto auf diesem Wege gesetzt werden, da die Klasse UserPrincipal nur Properties für einen häufig genutzten Teil der Active-Directory-Eigenschaften besitzt. Abbildung 1 aus der Microsoft-Management-Konsole „Active Directory Users and Computers“ zeigt das angelegte Benutzerkonto.

Abb. 1: Das neu angelegte Benutzerkonto

Abb. 1: Das neu angelegte Benutzerkonto

Aufmacherbild: Business Man Account LogIn Security Protection Concept von Shutterstock.com / Urheberrecht: Rawpixel

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -