Tags: Active Directory, PowerShell, Passwort
Das Attribut UserAccountControl im Active Directory enthält mehrere kritische Kontoeinstellungen. Das betrifft etwa das Ablaufdatum von Passwörtern oder die Delegierung. Ein AD-Audit sollte dieses Attribut regelmäßig prüfen. Das lässt sich mit PowerShell erledigen, und für das Ändern der Flags gibt es ein eigenes Cmdlet.
Bei UserAccountControl handelt es sich um einen Integer-Wert, und jedes seiner Bits dient als Flag für eine der Einstellungen.
So bedeutet zum Beispiel der Wert 2, dass das Konto deaktiviert wurde, oder 32 steht dafür, dass es kein Passwort benötigt. Eine vollständige Übersicht bietet die folgende Tabelle aus Microsofts Dokumentation.
Flag | Wert | Beschreibung |
---|---|---|
SCRIPT | 1 | The logon script will be run. |
ACCOUNTDISABLE | 2 | The user account is disabled. |
Undeclared | 4 | This flag is undeclared. |
HOMEDIR_REQUIRED | 8 | The home folder is required. |
LOCKOUT | 16 | |
PASSWD_NOTREQD | 32 | No password is required. |
PASSWD_CANT_CHANGE | 64 | The user cannot change the password. This is a permission on the user's object. |
ENCRYPTED_TEXT_ PWD_ALLOWED |
128 | Indicates whether Active Directory will store the password in the reversible encryption format. |
TEMP_DUPLICATE_ACCOUNT | 256 | This is an account for users whose primary account is in another domain. This account provides user access to this domain, but not to any domain that trusts this domain. |
NORMAL_ACCOUNT | 512 | This is a default account type that represents a typical user. |
INTERDOMAIN_TRUST_ACCOUNT | 2048 | This is a permit to trust an account for a system domain that trusts other domains. |
WORKSTATION_TRUST_ACCOUNT | 4096 | This is a computer account for a computer that is running Microsoft Windows NT 4.0 Workstation, Microsoft Windows NT 4.0 Server, Microsoft Windows 2000 Professional, or Windows 2000 Server and is a member of this domain. |
SERVER_TRUST_ACCOUNT | 8192 | This is a computer account for a domain controller that is a member of this domain. |
DONT_EXPIRE_PASSWORD | 65536 | Represents the password, which should never expire on the account. |
MNS_LOGON_ACCOUNT | 131072 | This is an MNS logon account. |
SMARTCARD_REQUIRED | 262144 | When this flag is set, it forces the user to log on by using a smart card. |
TRUSTED_FOR_DELEGATION | 524288 | When this flag is set, the service account (the user or computer account) under which a service runs is trusted for Kerberos delegation. Any such service can impersonate a client requesting the service. |
NOT_DELEGATED | 1048576 | When this flag is set, the security context of the user is not delegated to a service even if the service account is set as trusted for Kerberos delegation. Can be set using "Account is sensitive and cannot be delegated" checkbox. |
USE_DES_KEY_ONLY | 2097152 | Restrict this principal to use only Data Encryption Standard (DES) encryption types for keys. |
DONT_REQ_PREAUTH | 4194304 | This account does not require Kerberos pre-authentication for logging on. |
PASSWORD_EXPIRED | 8388608 | The user's password has expired. |
TRUSTED_TO_AUTH _FOR_DELEGATION |
16777216 | The account is enabled for delegation. This is a security-sensitive setting. Accounts that have this option enabled should be tightly controlled. This setting lets a service that runs under the account assume a client's identity and authenticate as that user to other remote servers on the network. |
PARTIAL_SECRETS_ACCOUNT | 67108864 | The account is a read-only domain controller (RODC). This is a security-sensitive setting. Removing this setting from an RODC compromises security on that server. |
Wenn man die Liste durchsieht, dann stellt sich heraus, dass einige Einstellungen sicherheitsrelevant sind. Das gilt etwa für die Option, dass ein Konto kein Passwort benötigt oder dafür eine symmetrische Verschlüsselung zulässt, ob Kerberos-Delegierung genutzt werden darf oder ob es sich mit einer Smartcard anmelden muss.
PowerShell bietet mit zwar mit Set-ADAccountControl ein Cmdlet, mit dem man diese Flags ändern kann, aber kein Gegenstück zum Auslesen und Aufschlüsseln des Attributs. Man kann dessen Wert jedoch aus AD-Benutzer und -Computer auslesen oder dafür zum Beispiel Get-ADUser ausführen.
Wenn man für diese Aufgabe PowerShell bevorzugt, dann sieht das entsprechende Kommando so aus:
Get-ADUser <user> -properties UserAccountControl |
select UserAccountControl
Attributwert aufschlüsseln
Als Ergebnis erhält man dann den Dezimalwert des Attributs, den man dann selbst interpretieren muss. Eine Möglichkeit besteht darin, diesen in eine binäre Zahl zu konvertieren und anschließend jede ihrer Stellen abzuklappern, um nachzusehen, ob sie auf 1 gesetzt ist. Trifft das zu, dann gibt man das dazugehörige Flag aus.
Das obige Script konvertiert die binäre Repräsentation des Attributwerts in ein Character-Array und dreht dessen Reihenfolge um, weil die Überprüfung mit der niedrigsten Stelle, also von hinten beginnen muss.
Konten mit bestimmtem Flag finden
Mit diesem Script kann man alle Flags für einzelne Konten ausgeben. In der Praxis wird man hingegen oft wissen wollen, welche Konten ein bestimmtes Flag gesetzt haben.
In einigen Fällen muss man dafür nicht den Wert von UserAccountControl aufdröseln, weil PowerShell dafür einfachere Methoden zur Verfügung stellt. Das gilt zum Beispiel für:
- Kennwort läuft nie ab, Passwort nicht erforderlich
- Deaktivierte Konten im Active Directory finden
- Gesperrte Konten mit PowerShell anzeigen
Will man aber etwa herausfinden, welche Accounts das Speichern der Passwörter in einem entschlüsselbaren Format zulassen, dann könnte man folgende Abfrage nutzen:
Get-ADUser -Filter * -Properties UserAccountControl |
Where { $_.UserAccountControl -band 128} | Select name
Dieser Aufruf nutzt ein Bit-weises and, um festzustellen, ob das Flag ENCRYPTED_TEXT_PWD_ALLOWED gesetzt ist. Wie man aus der Tabelle entnehmen kann, repräsentiert es die achte Stelle der binären Zahl (2 ^ 7 = 128, Zählung startet bei Bit 0). Wenn man auf sie eine -band-Operation mit dem Wert 128 anwendet und das Ergebnis $true ist, dann weiß man, dass das Flag gesetzt ist.
Nach dem gleichen Muster kann man die Werte für die anderen Flags in diese Abfrage einsetzen:
Get-ADComputer -Filter * -Properties UserAccountControl |
Where { $_.UserAccountControl -band 524288 } | Select name
Dieses Beispiel würde Computer-Konten ermitteln, denen bei der Kerberos-Delegierung vertraut wird.
Flags ändern
Hat man Konten ermittelt, die ungünstig konfiguriert sind, dann kann man das Attribut UserAccountControl relativ einfach mit dem bereits erwähnten Cmdlet Set-ADAccountControl ändern.
Es bietet einen eigenen Parameter für jedes Flag, den man nach Bedarf auf $true oder $false setzen kann.
Für einzelne Konten kann man einige Einstellungen von UserAccountControl interaktiv mit Hilfe von Active Directory-Benutzer und -Computer konfigurieren.
Zusammenfassung
Das Attribut UserAccountControl enthält mehrere sicherheitsrelevante Einstellungen für AD-Konten. Diese sind als Bits eines Integer-Werts implementiert. Leider bietet PowerShell kein Cmdlet, mit dem sich das Attribut aufschlüsseln lässt.
Daher muss man UserAccountControl über Get-ADUser oder Get-ADComputer ermitteln und dann über eine Bit-Operation auf die einzelnen Flags abfragen.
Findet man unerwünschte Einstellungen, dann kann man diese hingegen sehr einfach mit Set-ADAccountControl ändern.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Wann haben Benutzer zuletzt ihr Passwort im Active Directory geändert?
- AD-Konten mit ChangePasswordAtLogon in PowerShell finden, Wechsel des Passworts erzwingen
- Ablaufdatum von AD-Passwörtern in PowerShell auslesen
- Passwort-Einstellungen mit PowerShell: Kennwort läuft nie ab, Passwort nicht erforderlich
- Neue Policy für Authentifizierung ohne Passwort und erweiterte Web-Anmeldung für Windows 11
Weitere Links