3 Stimmen

Active Directoy LDAP - Benutzerkonto sperren

Wie sperrt man am besten ein Active Directory-Konto?

int val = (int)directoryentry.Properties["userAccountControl"].Value;
directoryentry.Properties["userAccountControl"].Value = val | 0x0010;

vs.

directoryentry.InvokeSet("IsAccountLocked", true); 

Gibt es einen besseren Weg?

1 Stimmen

+1 Ich habe die Methode DirectoryEntry.InvokeSet() gelernt. Danke! =)

1voto

Will Marcouiller Punkte 23205

In der Tat müssen Sie eine bitweise Operation durchführen, um das richtige Bit auf den entsprechenden Wert zu setzen. In dem unten stehenden Link werden Sie auf die User Account Control Flags stoßen. Sie müssen also nur die entsprechende logische Operation mit der Eigenschaft durchführen, um das Konto entweder zu sperren oder zu entsperren.

Der folgende Link wird Sie sicher interessieren.

Wie man (fast) alles in AD

Ich werde zu einem späteren Zeitpunkt einen C#-Beispielcode hinzufügen.

Hier ist der vorgeschlagene Code:

public class AdUser {
    private int _userAccountControl
    public bool IsLocked {
        get {
            return _userAccountControl & UserAccountControls.Lock
        } set {
            if(value)
                _userAccountControl = _userAccountControl | UserAccountControls.Lock
            else
                // Must reverse all the bits in the filter when performing an And operation
                _userAccountControl = _userAccountControl & ~UserAccountControls.Lock
        }
    }
    public enum UserAccountControls {
        Lock = 0x10
    }
}

Bitte bedenken Sie, dass Sie vielleicht einige Änderungen an diesem Code vornehmen müssen, da ich ihn nicht getestet habe. Aber Ihr Code sollte so oder so ähnlich sein wie der zum Sperren und Entsperren des Benutzerkontos. Früher oder später werden Sie die DirectoryEntry.Properties[] verwenden müssen, um sie auf den Wert in Ihrer Objektklasse zu setzen.

EDIT

Wie sperrt man am besten ein Active Directory-Konto?

   int val = (int)directoryentry.Properties["userAccountControl"].Value;  
   directoryentry.Properties["userAccountControl"].Value = val | 0x0010;

vs.

   directoryentry.InvokeSet("IsAccountLocked", true); 

Als Antwort auf Ihre Frage, die ich in meinem Edit gestellt habe, würde ich sagen, dass dies der einfachste Weg ist, zumindest den ich kenne. Ich bevorzuge es, soweit es mich betrifft, diese Funktionen so zu verpacken, wie ich es ungefähr in meinem Codebeispiel getan habe, so dass sich die anderen Programmierer nicht um die bitweisen Operationen usw. kümmern müssen. Für sie sind es Objekte, die sie manipulieren.

Welcher der beiden Wege der beste ist, ist wohl vor allem eine Frage der Vorliebe. Wenn Sie mit logischen Operationen vertraut sind, sind diese normalerweise vorzuziehen. Im Vergleich dazu ist die zweite Option jedoch einfacher zu handhaben.

1voto

marc_s Punkte 701497

Verwenden Sie .NET 3.5 (oder können Sie darauf aktualisieren)?

Wenn ja, sollten Sie sich die neue System.DirectoryServices.AccountManagement Namespace und alles, was er zu bieten hat! Eine hervorragende Einführung ist die MSDN-Artikel Verwalten von Verzeichnissicherheitsprinzipien in .NET Framework 3.5 .

In Ihrem Fall müssten Sie sich an einen UserPrincipal in irgendeiner Weise, z.B.

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
UserPrincipal me = UserPrincipal.Current;

und dann haben Sie Zugang zu einer Fülle von wirklich einfach zu verwendenden Eigenschaften und Methoden - z.B.:

bool isLockedOut = me.IsAccountLockedOut();

und Sie können ein gesperrtes Konto mit entsperren:

me.UnlockAccount();

VIEL einfacher als die einfache alte System.DirectoryServices Zeug!

0 Stimmen

Kann bitte jemand diese Antwort bearbeiten, um das letzte Codebeispiel zu entfernen, das besagt, dass IsAccountLockedOut ist eine Eigenschaft, die eingestellt werden kann. Diese Eigenschaft und Funktionalität gibt es nicht.

1 Stimmen

Abgestimmt, weil die Frage lautet, wie man programmatisch sperrt, und diese Antwort zeigt, wie man es nur entsperrt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X