Odszyfrowanie wartości atrybutu userAccountControl w usłudze Active Directory

UserAccountControl jest jednym z ważnych atrybutów kont użytkowników i komputerów Active Directory. Ten atrybut określa status konta w domenie: czy konto jest aktywne czy zablokowane, czy włączona jest opcja zmiany hasła przy następnym logowaniu, czy użytkownik może zmienić swoje hasło itp.). Jednak nie wszyscy administratorzy mają jasne pojęcie o tym, w jaki sposób używany jest atrybut UserAccountControl i dlaczego jest on używany w AD..

Na przykład otwórz właściwości dowolnego konta AD w konsoli ADUC i przejdź do karty Konto (Konto). Zwróć uwagę na grupę atrybutów użytkownika w sekcji Kontrola konta (Ustawienia konta). Dostępne są następujące opcje konta:

  • Użytkownik musi zmienić hasło przy następnym logowaniu (Wymagaj zmiany hasła przy następnym logowaniu);
  • Użytkownik nie może zmienić hasła;
  • Hasło nigdy nie wygasa (hasło nie jest ograniczone);
  • Przechowuj hasło przy użyciu szyfrowania odwracalnego (szyfrowanie niepewne) - niebezpieczne;
  • Konto jest wyłączone
  • Do interaktywnego logowania wymagana jest karta inteligentna (do interaktywnego logowania do sieci wymagana jest karta inteligentna);
  • Konto jest wrażliwe i nie można go przekazać (konto jest ważne i nie można go przekazać);
  • Używaj typów szyfrowania Kerberos DES dla tego konta (Używaj tylko typów szyfrowania Kerberos DES dla tego konta);
  • To konto obsługuje szyfrowanie Kerberos AES 128/256 bitów (To konto obsługuje szyfrowanie 128/256-bitowe Kerberos AES);
  • Nie wymagaj wstępnego uwierzytelnienia Kerberos (bez wcześniejszego uwierzytelnienia Kerberos).

Każdy z tych atrybutów konta jest zasadniczo wartością bitową, która może być w stanie 1 (prawda) lub 0 (fałsz). Jednak te wartości nie są przechowywane jako osobne atrybuty AD, zamiast tego używany jest atrybut UserAccountControl.

Treść

  • UserAccountControl - atrybut Active Directory
  • Skrypt PowerShell do odszyfrowywania wartości UserAccountControl

UserAccountControl - atrybut Active Directory

Łączna wartość wszystkich tych opcji jest przechowywana w wartości atrybutu konta UserAccountControl, tj. zamiast tego pojedynczy atrybut Active Directory służy do przechowywania wszystkich tych opcji w różnych atrybutach. Atrybut UserAccountControl to maska ​​bitowa, z których każdy bit jest osobną flagą, która wyświetla wartość jednej z określonych opcji i może mieć inną wartość (włączoną lub wyłączoną). W związku z tym, w zależności od włączonych opcji konta, użytkownik otrzyma inną wartość atrybutu UserAccountControl. Można wyświetlić bieżącą wartość atrybutu na karcie Edytor atrybutów lub za pomocą następującego polecenia cmdlet Get-ADUser programu PowerShell:

get-aduser użytkownik1-właściwości * | wybierz nazwę, UserAccountControl | ft

W tym przykładzie wartość atrybutu 0x10202 (w zapisie dziesiętnym 66050) Co oznaczają te liczby??

Poniżej znajduje się tabela dostępnych flag kont w AD. Każda z flag odpowiada konkretnemu bitowi atrybutu UserAccountControl, a wartość UserAccountControl jest równa sumie wszystkich flag.

FlagaWartość w HEX Wartość dziesiętna
SCRIPT (Uruchom skrypt logowania)0x00011
ACCOUNTDISABLE (konto wyłączone)0x00022)
HOMEDIR_REQUIRED (wymagany folder domowy)0x00088
LOCKOUT (konto zablokowane)0x001016
PASSWD_NOTREQD (hasło nie jest wymagane)0x002032
PASSWD_CANT_CHANGE (Odmów zmiany hasła użytkownika)0x004064
ENCRYPTED_TEXT_PWD_ALLOWED (Przechowuj hasło przy użyciu szyfrowania odwracalnego)0x0080128
TEMP_DUPLICATE_ACCOUNT (konto użytkownika, którego główne konto jest przechowywane w innej domenie)0x0100256
NORMAL_ACCOUNT (konto domyślne. Normalne aktywne konto)0x0200512
INTERDOMAIN_TRUST_ACCOUNT0x08002048
WORKSTATION_TRUST_ACCOUNT0x10004096
SERVER_TRUST_ACCOUNT0x20008192
DONT_EXPIRE_PASSWORD (Hasło nie wygasło)0x1000065536
MNS_LOGON_ACCOUNT0x20000131072
SMARTCARD_REQUIRED (wymagana karta inteligentna do interaktywnego dostępu do sieci)0x40000262144
TRUSTED_FOR_DELEGATION0x80000524288
NOT_DELEGATED0x1000001048576
USE_DES_KEY_ONLY0x2000002097152
DONT_REQ_PREAUTH (nie wymaga uwierzytelnienia Kerberos)0x4000004 194,304
PASSWORD_EXPIRED (hasło użytkownika wygasło)0x8000008388608
TRUSTED_TO_AUTH_FOR_DELEGATION0x100000016777216
PARTIAL_SECRETS_ACCOUNT0x0400000067108864

Na przykład istnieje zwykłe konto, dla którego wymóg zmiany hasła jest wyłączony. Wartość userAccountControl uzyskuje się w następujący sposób

NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) = 66048

W związku z tym wartość userAccountControl z mojego przykładu (66050) okazała się następująca:

NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) + ACCOUNTDISABLE (2) = 66050

W przypadku zwykłego zablokowanego konta wartość userAccountControl będzie wynosić 514:

(NORMAL_ACCOUNT (512) + ACCOUNTDISABLE (2) = 514

Domyślne wartości UserAccountControl dla typowych obiektów domeny:

  • Użytkownik standardowy: 0x200 (512)
  • Kontroler domeny: 0x82000 (532480)
  • Stacja robocza / serwer: 0x1000 (4096)

Za pomocą filtrów można wybierać spośród obiektów AD z określoną wartością atrybutu useraccountcontrol. Na przykład, aby wyświetlić wszystkie aktywne (zwykłe konta):

Get-ADUser -Properties * -ldapFilter „(useraccountcontrol = 512)”

Wyświetl wszystkie zablokowane konta:

Get-ADUser -Properties * -ldapFilter „(useraccountcontrol = 514)”

Lista kont z nieograniczonym hasłem:

Get-ADUser -Properties * -ldapFilter „(useraccountcontrol = 66048)”

Możesz dodać niezbędne bity z tabeli i wybrać obiekty AD za pomocą następujących poleceń:

$ UserAccountControl_hex = 0x10000 + 0x0080 + 0x200000
Get-ADUser -Filter UserAccountControl -band $ UserAccountControl_hex

Skrypt PowerShell do odszyfrowywania wartości UserAccountControl

Dla wygody chciałbyś mieć pod ręką narzędzie, które automatycznie przekształciłoby wartość maski bitowej UserAccountControl w normalną ludzką postać. Spróbujmy napisać prostą funkcję dla skryptów PowerShell, która pobiera wartość dziesiętną atrybutu UserAccountControl i wyświetla listę uwzględnionych opcji rozliczania. Ponieważ Atrybut UserAccountControl jest maską bitową, do każdego bitu można przypisać opis tekstowy.

Mam taki skrypt PowerShell do konwersji wartości UserAccountControl do postaci czytelnej:

Funkcja ConvertUserAccountControl ([int] $ UAC)

$ UACPropertyFlags = @ (
PISMO,
„ACCOUNTDISABLE”,
„ZASTRZEŻONE”,
„HOMEDIR_REQUIRED”,
„LOCKOUT”,
„PASSWD_NOTREQD”,
„PASSWD_CANT_CHANGE”,
„ENCRYPTED_TEXT_PWD_ALLOWED”,
„TEMP_DUPLICATE_ACCOUNT”,
„NORMAL_ACCOUNT”,
„ZASTRZEŻONE”,
„INTERDOMAIN_TRUST_ACCOUNT”,
„WORKSTATION_TRUST_ACCOUNT”,
„SERVER_TRUST_ACCOUNT”,
„ZASTRZEŻONE”,
„ZASTRZEŻONE”,
„DONT_EXPIRE_PASSWORD”,
„MNS_LOGON_ACCOUNT”,
„SMARTCARD_REQUIRED”,
„TRUSTED_FOR_DELEGATION”,
„NOT_DELEGATED”,
„USE_DES_KEY_ONLY”,
„DONT_REQ_PREAUTH”,
„PASSWORD_EXPIRED”,
„TRUSTED_TO_AUTH_FOR_DELEGATION”,
„ZASTRZEŻONE”,
PARTIAL_SECRETS_ACCOUNT
„ZASTRZEŻONE”
„ZASTRZEŻONE”
„ZASTRZEŻONE”
„ZASTRZEŻONE”
„ZASTRZEŻONE”
)

$ Attributes = ""
1 ... ($ UACPropertyFlags.Length) | Where-Object $ UAC -bA [matematyka] :: Pow (2, $ _) | ForEach-Object If ($ Attributes.Length -EQ 0) $ Attributes = $ UACPropertyFlags [$ _] Else $ Attributes = $ Attributes + "|" + $ UACPropertyFlags [$ _]
Zwróć atrybuty $

Sprawdź, jaka jest wartość UserAccountControl 66050:

ConvertUserAccountControl 66050

Jak widać, skrypt zwrócił, że użytkownik ma włączone atrybuty:

ACCOUNTDISABLE + NORMAL_ACCOUNT + DONT_EXPIRE_PASSWORD

Tego samego skryptu można użyć do natychmiastowego odszyfrowania wartości UserAccountControl podczas pobierania informacji o poświadczeniach AD w wygodnej formie za pomocą polecenia cmdlet Get-AdUser lub Get-AdComputer, na przykład:

get-aduser sam-prnt -properties * | select @ n = 'UsrAcCtrl'; e = ConvertUserAccountControl ($ _. userAccountControl)

RACHUNKOWOŚĆ | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD

get-adcomputer sam-dc01 -properties * | select @ n = 'UsrAcCtrl'; e = ConvertUserAccountControl ($ _. userAccountControl)

SERVER_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION