cool IT Team-Blog

ActiveDirectory-Zugriff über LDAP auf die Konto-Optionen

Sämtliche Attribute die an Objekten im Active-Directory hängen können programmatisch sehr einfach über LDAP gelesen und auch geschrieben werden. Die Konto-Optionen sind aber in ein eigenes Feld gekapselt, sodaß die Abfrage, ob ein User deaktiviert ist oder nicht etwas komplizierter ist.

Das Feld "UserAccountControl" kapselt alle Konto-Optionen in einen Bit-Vektor. Will man daher wissen, ob ein bestimmtes Bit gesetzt ist, muss ein Vergleich auf Bit-Ebene durchgeführt werden. Welche Konto-Option in welchem Bit steht kann einem Artikel von Microsoft entnommen werden (http://msdn.microsoft.com/en-us/library/ms680832(VS.85).aspx).

Will man z.B. alle Benutzer abfragen, deren Account deaktiviert ist, sieht die LDAP-Query wie folgt aus:
(userAccountControl:1.2.840.113556.1.4.803:=2)

Hierbei wird auf das Attribut "UserAccountControl" der Filter "1.2.840.1.4.803" verwendet, der eine Bit-Operation darstellt, die für alle Benutzer, die das Bit gesetzt haben, auf TRUE evaluiert. Zu beachten ist, dass das Bit als Dezimal-Wert angegeben werden muss (im obigen Fall das Bit mit dem Wert 2). Der ganze Ausdruck kann auch mit einem "!" negiert werden, sodaß alle Benutzer zurückgegeben werden, die nicht deaktiviert sind.

Um jetzt den Wert des Bits ohne Filter auszulesen und in einen Boole'schen Datentyp umzuwandeln, muss auf den Bit-Vektor eine UND-Operation ausgeführt werden.
bool isDeactivated = userAccountControlValue & 2;

Zum Schreiben der Flags wird ein ähnlicher Mechanismus verwendet. Will man zum Beispiel das Flag setzen, wenn es noch nicht gesetzt ist, berechnet sich der neue Wert über:
long newUserAccountControlValue = oldUserAccountControlValue + 2;
Analog funktioniert das Aufheben des Flags, wenn es vorher gesetzt war:
long newUserAccountControlValue = oldUserAccountControlValue - 2;

Dieser beschriebene Mechanismus zum Filtern, Lesen und Schreiben der Konto-Optionen funktioniert für alle Flags außer "User can't change Password". Filtern und Lesen ist über LDAP zwar möglich, aber es kann nicht über LDAP geschrieben werden.
Das Problem kann man umgehen, wenn man für dieses Flag nicht den Namespace System.DirectoryServices, sondern den Namespace System.DirectoryServices.AccountManagement verwendet, der einem ein Objekt-Modell für den Zugriff auf das Active-Directory zur Verfügung stellt. Mehr zu diesem Namespace finden Sie unter http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.aspx.

Ist doch cool, oder?
Verfasst: 08.09.2010 13:51:45 von Robert Stefan
Tags: active directory, ldap, useraccountcontrol

1


Kommentare
Für diesen Blogbeitrag liegen zurzeit keine Kommentare vor.
Einen Kommentar schreiben



 Security code