UserAccountControl เป็นหนึ่งในแอตทริบิวต์สำคัญที่สุดของออบเจ็กต์ผู้ใช้และคอมพิวเตอร์ใน Active Directory แอตทริบิวต์นี้กำหนดสถานะของบัญชีในโดเมน AD: ว่าบัญชีใช้งานได้หรือถูกล็อก, เปิดใช้งานตัวเลือกเปลี่ยนรหัสผ่านครั้งถัดไปหรือไม่, ผู้ใช้สามารถเปลี่ยนรหัสผ่านได้หรือไม่ เป็นต้น อย่างไรก็ตาม ไม่ใช่ทุกผู้ดูแลระบบที่เข้าใจอย่างเต็มที่ว่า UserAccountControl ทำงานอย่างไรและใช้ทำอะไรใน AD
แอตทริบิวต์/แฟล็ก UserAccountControl ใน Active Directory
เปิดคุณสมบัติของบัญชี AD ใดๆ ในคอนโซล Active Directory Users and Computers (ADUC, dsa.msc) และไปที่แท็บ Account โปรดสังเกตกลุ่มแอตทริบิวต์ผู้ใช้ในส่วน Account Options ที่นี่คุณจะเห็นตัวเลือกต่อไปนี้:
- ผู้ใช้ต้องเปลี่ยนรหัสผ่านที่ครั้งถัดไปที่ล็อกอิน
- ผู้ใช้ไม่สามารถเปลี่ยนรหัสผ่านได้
- รหัสผ่านไม่มีวันหมดอายุ โดยค่าเริ่มต้น นโยบายรหัสผ่านโดเมนใน AD กำหนดให้ผู้ใช้เปลี่ยนรหัสผ่านเป็นระยะ
- จัดเก็บรหัสผ่านโดยใช้การเข้ารหัสแบบกลับกันได้ (ไม่ปลอดภัย)
- บัญชีถูกปิดใช้งาน
- ต้องใช้สมาร์ทการ์ดสำหรับการล็อกอินแบบโต้ตอบ
- บัญชีเป็นข้อมูลละเอียดอ่อนและไม่สามารถมอบหมายได้
- ใช้การเข้ารหัส Kerberos DES สำหรับบัญชีนี้
- บัญชีนี้รองรับการเข้ารหัส Kerberos AES 128/256-bit
- ไม่ต้องการการรับรองความถูกต้องล่วงหน้า Kerberos
แต่ละแอตทริบิวต์บัญชีผู้ใช้เหล่านี้เป็นค่าบิต (แฟล็ก) ที่สามารถเป็น 1 (True) หรือ 0 (False) ได้ อย่างไรก็ตาม ค่าเหล่านี้ไม่ได้จัดเก็บเป็นแอตทริบิวต์ AD แยกต่างหาก แทนที่จะใช้แอตทริบิวต์ UserAccountControl
ค่ารวมของตัวเลือกทั้งหมดที่ระบุไว้ข้างต้นจะถูกจัดเก็บในค่าของแอตทริบิวต์ UserAccountControl แทนที่จะจัดเก็บตัวเลือกทั้งหมดในแอตทริบิวต์ผู้ใช้ที่แตกต่างกัน ใช้แอตทริบิวต์ Active Directory เพียงตัวเดียว UserAccountControl เป็น บิตมาสก์ (bitmask) แต่ละบิตเป็นแฟล็กแยกต่างหากและมีค่า On (True) หรือ Off (False) ขึ้นอยู่กับตัวเลือกบัญชีที่เปิดใช้งาน ผู้ใช้จะมีค่าแอตทริบิวต์ UserAccountControl ที่แตกต่างกัน คุณสามารถดูค่าปัจจุบันของแอตทริบิวต์ในแท็บ Attribute Editor ที่เกี่ยวข้อง หรือใช้คำสั่ง Get-ADUser ใน PowerShell:
get-aduser jkelly -properties *|select name,UserAccountControl | ft
ในตัวอย่างนี้ ค่าของแอตทริบิวต์คือ 0x10202 (ค่าทศนิยมคือ 66050) ตัวเลขเหล่านี้หมายถึงอะไร?
ตารางแฟล็กที่มีอยู่ของบัญชี AD กำหนดไว้ด้านล่าง แต่ละแฟล็กสอดคล้องกับบิต UserAccountControl บางบิต และค่า UserAccountControl เท่ากับผลรวมของแฟล็กทั้งหมด
| แฟล็ก UserAccountControl | ค่า HEX | ค่าทศนิยม |
|---|---|---|
| SCRIPT (การรันสคริปต์ล็อกอิน) | 0x0001 | 1 |
| ACCOUNTDISABLE (บัญชีถูกปิดใช้งาน) | 0x0002 | 2 |
| HOMEDIR_REQUIRED (ต้องการโฟลเดอร์โฮม) | 0x0008 | 8 |
| LOCKOUT (บัญชีถูกล็อก) | 0x0010 | 16 |
| PASSWD_NOTREQD (ไม่ต้องการรหัสผ่าน) | 0x0020 | 32 |
| PASSWD_CANT_CHANGE (ป้องกันไม่ให้ผู้ใช้เปลี่ยนรหัสผ่าน) | 0x0040 | 64 |
| ENCRYPTED_TEXT_PWD_ALLOWED (อนุญาตจัดเก็บรหัสผ่านแบบเข้ารหัสกลับกันได้) | 0x0080 | 128 |
| TEMP_DUPLICATE_ACCOUNT (บัญชีผู้ใช้ซ้ำชั่วคราว) | 0x0100 | 256 |
| NORMAL_ACCOUNT (บัญชีปกติ บัญชีทั่วไปที่ใช้งานอยู่) | 0x0200 | 512 |
| INTERDOMAIN_TRUST_ACCOUNT | 0x0800 | 2048 |
| WORKSTATION_TRUST_ACCOUNT | 0x1000 | 4096 |
| SERVER_TRUST_ACCOUNT | 0x2000 | 8192 |
| DONT_EXPIRE_PASSWORD (บัญชีผู้ใช้ที่รหัสผ่านไม่หมดอายุ) | 0x10000 | 65536 |
| MNS_LOGON_ACCOUNT | 0x20000 | 131072 |
| SMARTCARD_REQUIRED (ต้องใช้สมาร์ทการ์ดเพื่อล็อกอินเครือข่าย) | 0x40000 | 262144 |
| TRUSTED_FOR_DELEGATION | 0x80000 | 524288 |
| NOT_DELEGATED | 0x100000 | 1048576 |
| USE_DES_KEY_ONLY | 0x200000 | 2097152 |
| DONT_REQ_PREAUTH (ไม่ต้องการการรับรองความถูกต้องล่วงหน้า Kerberos) | 0x400000 | 4194304 |
| PASSWORD_EXPIRED (รหัสผ่านผู้ใช้หมดอายุ) | 0x800000 | 8388608 |
| TRUSTED_TO_AUTH_FOR_DELEGATION | 0x1000000 | 16777216 |
| PARTIAL_SECRETS_ACCOUNT | 0x04000000 | 67108864 |
เช่น มีบัญชีทั่วไปที่ปิดใช้งานข้อกำหนดการเปลี่ยนรหัสผ่าน ค่า userAccountControl คำนวณได้ดังนี้:
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) = 66048
ตามลำดับ ค่า userAccountControl จากตัวอย่างของฉัน (66050) ได้มาจาก:
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) + ACCOUNTDISABLE (2) = 66050
บัญชีผู้ใช้ที่ปิดใช้งานมีค่า userAccountControl เป็น 514:
(NORMAL_ACCOUNT (512)+ ACCOUNTDISABLE (2) = 514
ค่า UserAccountControl เริ่มต้นสำหรับออบเจ็กต์โดเมนทั่วไป:
- ผู้ใช้ AD ทั่วไป: 0x200 (512)
- โดเมนคอนโทรลเลอร์: 0x82000 (532480)
- เวิร์กสเตชัน/เซิร์ฟเวอร์: 0x1000 (4096)
คุณสามารถใช้ตัวกรอง LDAP เพื่อเลือกออบเจ็กต์จาก AD ที่มีค่า useraccountcontrol เฉพาะได้ เช่น เพื่อแสดงบัญชีที่ใช้งานอยู่ (ปกติ) ทั้งหมด:
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=512)"
แสดงรายการบัญชีผู้ใช้ที่ปิดใช้งานทั้งหมด:
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=514)"
รายการบัญชีที่มีตัวเลือก rหัสผ่านไม่หมดอายุ:
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=66048)"
คุณสามารถรวมบิตที่ต้องการจากตารางและเลือกออบเจ็กต์ AD โดยใช้คำสั่ง:
$UserAccountControl_hex= 0x10000 + 0x0080 + 0x200000
Get-ADUser -Filter {UserAccountControl -band$UserAccountControl_hex}
ถอดรหัสค่า UserAccountControl ด้วยสคริปต์ PowerShell
เพื่อความสะดวก ฉันต้องการเครื่องมือสำหรับแปลงค่าบิตมาสก์ UserAccountControl ให้อยู่ในรูปแบบที่มนุษย์อ่านเข้าใจง่าย ลองเขียนฟังก์ชัน PowerShell เรียบง่ายที่รับค่าทศนิยมของแอตทริบิวต์ UserAccountControl และส่งคืนรายการตัวเลือกบัญชีที่เปิดใช้งาน เนื่องจาก UserAccountControl เป็นบิตมาสก์ คุณสามารถกำหนดคำอธิบายข้อความให้แต่ละบิตได้
ฉันเขียนฟังก์ชัน PowerShell DecodeUserAccountControl เพื่อแปลงค่า UserAccountControl ให้อยู่ในรูปแบบอ่านง่าย:
Function DecodeUserAccountControl ([int]$UAC)
{
$UACPropertyFlags = @(
"SCRIPT",
"ACCOUNTDISABLE",
"RESERVED",
"HOMEDIR_REQUIRED",
"LOCKOUT",
"PASSWD_NOTREQD",
"PASSWD_CANT_CHANGE",
"ENCRYPTED_TEXT_PWD_ALLOWED",
"TEMP_DUPLICATE_ACCOUNT",
"NORMAL_ACCOUNT",
"RESERVED",
"INTERDOMAIN_TRUST_ACCOUNT",
"WORKSTATION_TRUST_ACCOUNT",
"SERVER_TRUST_ACCOUNT",
"RESERVED",
"RESERVED",
"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",
"RESERVED",
"PARTIAL_SECRETS_ACCOUNT"
"RESERVED"
"RESERVED"
"RESERVED"
"RESERVED"
"RESERVED"
)
return (0..($UACPropertyFlags.Length) | ?{$UAC -bAnd [math]::Pow(2,$_)} | %{$UACPropertyFlags[$_]}) -join ” | ”
}
ลองตรวจสอบว่าค่า 66050 ของ UserAccountControl หมายถึงอะไร:
DecodeUserAccountControl 66050
ตามที่คุณเห็น สคริปต์ส่งคืนว่าแฟล็กต่อไปนี้เปิดใช้งานสำหรับผู้ใช้นี้:
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
สคริปต์เดียวกันนี้สามารถใช้ถอดรหัสค่า UserAccountControl แบบเรียลไทม์เมื่อดึงข้อมูลเกี่ยวกับบัญชี AD ในรูปแบบที่สะดวกโดยใช้คำสั่ง Get-ADUser หรือ Get-ADComputer เช่น:
get-aduser ms-pam -properties *|select @{n='UsrAcCtrl';e={DecodeUserAccountControl($_.userAccountControl)}}
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
get-adcomputer rome-dc01 -properties *|select @{n='UsrAcCtrl';e={DecodeUserAccountControl($_.userAccountControl)}}
SERVER_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION
วิธีตั้งค่าแอตทริบิวต์ UserAccoutControl ใน AD ด้วย PowerShell
คุณสามารถเปลี่ยนตัวเลือกแต่ละรายการของแอตทริบิวต์ UserAccountControl ใน Active Directory โดยใช้คำสั่ง PowerShell Set-ADUser และ Set-ADComputer ทั้งสองคำสั่งมีตัวเลือกแยกต่างหาก เช่น:
- AccountNotDelegated
- AllowReversiblePasswordEncryption
- CannotChangePassword
- ChangePasswordAtLogon
- KerberosEncryptionType
- PasswordNeverExpires
- PasswordNotRequired
- PrincipalsAllowedToDelegateToAccount
รหัสผ่านบัญชีคอมพิวเตอร์ใน AD ให้ความสัมพันธ์เชื่อมั่นระหว่างคอมพิวเตอร์และโดเมน ดังนั้น เพื่อเปลี่ยนตัวเลือกบางอย่างของผู้ใช้ คุณต้องใช้คำสั่งต่อไปนี้:
Set-ADUser jkelly –CannotChangePassword:$true -PasswordNeverExpires:$true
หรือคุณสามารถใช้คำสั่ง Set-UserAccountControl แบบทั่วไป:
Set-ADAccountControl -Identity jkelly -CannotChangePassword $True -PasswordNeverExpires $True
คุณยังสามารถเปิดใช้งานตัวเลือกบัญชีผู้ใช้ทั้งสองนี้โดยตรงโดยการตั้งค่าค่าที่แน่นอนผ่านแอตทริบิวต์ UserAccountControl:
Set-ADUser jkelly -Replace @{UserAccountControl= 66048}