UserAccountControl เป็นหนึ่งในคุณลักษณะที่สำคัญที่สุดของผู้ใช้และวัตถุคอมพิวเตอร์ใน Active Directory คุณลักษณะนี้กำหนดสถานะของบัญชีในโดเมน AD:บัญชีมีการใช้งานหรือถูกล็อก ไม่ว่าจะเปิดใช้งานตัวเลือกในการเปลี่ยนรหัสผ่านเมื่อเข้าสู่ระบบครั้งถัดไป ผู้ใช้สามารถเปลี่ยนรหัสผ่านได้หรือไม่ ฯลฯ อย่างไรก็ตาม ไม่ใช่ผู้ดูแลระบบทั้งหมด ตระหนักดีถึงวิธีการทำงานของแอตทริบิวต์ UserAccountControl และสิ่งที่ใช้สำหรับโฆษณา
แอตทริบิวต์/การตั้งค่าสถานะ UserAccountControl ใน Active Directory
เปิดคุณสมบัติของบัญชี AD ใน Active Directory Users and Computers (ADUC, dsa.msc
) คอนโซลและไปที่ บัญชี แท็บ โปรดให้ความสนใจกับกลุ่มแอตทริบิวต์ผู้ใช้ใน ตัวเลือกบัญชี ส่วน. คุณจะเห็นตัวเลือกต่อไปนี้:
- ผู้ใช้ต้องเปลี่ยนรหัสผ่านเมื่อเข้าสู่ระบบครั้งถัดไป
- ผู้ใช้ไม่สามารถเปลี่ยนรหัสผ่านได้
- รหัสผ่านไม่มีวันหมดอายุ โดยค่าเริ่มต้น นโยบายรหัสผ่านโดเมนใน AD กำหนดให้ผู้ใช้เปลี่ยนรหัสผ่านเป็นระยะ
- จัดเก็บรหัสผ่านโดยใช้การเข้ารหัสแบบย้อนกลับได้ (ไม่ปลอดภัย);
- บัญชีถูกปิดใช้งาน
- ต้องใช้สมาร์ทการ์ดสำหรับการเข้าสู่ระบบแบบโต้ตอบ
- บัญชีมีความละเอียดอ่อนและไม่สามารถมอบหมายได้
- ใช้ประเภทการเข้ารหัส Kerberos DES สำหรับบัญชีนี้
- บัญชีนี้รองรับการเข้ารหัส Kerberos AES 128/256 บิต
- ไม่ต้องมีการตรวจสอบสิทธิ์ล่วงหน้าของ Kerberos
แต่ละแอตทริบิวต์ของบัญชีผู้ใช้เหล่านี้โดยพื้นฐานแล้วเป็นค่าบิต (แฟล็ก) ที่สามารถเป็น 1 (True
) หรือ 0 (False
). อย่างไรก็ตาม ค่าเหล่านี้จะไม่ถูกจัดเก็บเป็นแอตทริบิวต์ AD แยกต่างหาก แต่จะใช้แอตทริบิวต์ UserAccountControl แทน
มูลค่ารวมของตัวเลือกทั้งหมดที่ระบุข้างต้นถูกเก็บไว้ในค่าของ UserAccountControl คุณลักษณะ. แทนที่จะเก็บตัวเลือกเหล่านี้ไว้ในแอตทริบิวต์ผู้ใช้ที่แตกต่างกัน จะมีการใช้แอตทริบิวต์ Active Directory รายการเดียว UserAccountControl เป็น บิตมาสก์ แต่ละบิตเป็นแฟล็กแยกต่างหากและมีค่า เปิด (จริง) หรือ ปิด (เท็จ). ผู้ใช้จะมีค่าแอตทริบิวต์ UserAccountControl ที่แตกต่างกัน ทั้งนี้ขึ้นอยู่กับตัวเลือกบัญชีที่เปิดใช้งาน คุณสามารถดูค่าปัจจุบันของแอตทริบิวต์ได้ในแท็บ Attribute Editor ที่เกี่ยวข้องหรือใช้ Get-ADUser cmdlet ใน PowerShell:
get-aduser jkelly -properties *|select name,UserAccountControl | ft
ในตัวอย่างนี้ ค่าของแอตทริบิวต์คือ 0x10202 (ค่าทศนิยมคือ 66050 ). ตัวเลขเหล่านี้หมายความว่าอย่างไร
ตารางแฟล็กที่มีอยู่ของบัญชี AD แสดงไว้ด้านล่าง แต่ละแฟล็กสอดคล้องกับบิต UserAccountControl และค่า UserAccountControl จะเท่ากับผลรวมของแฟล็กทั้งหมด
การตั้งค่าสถานะ UserAccountControl ค่า HEX ค่าทศนิยม SCRIPT (เรียกใช้สคริปต์การเข้าสู่ระบบ)0x00011ACCOUNTDISABLE (บัญชีถูกปิดใช้งาน)0x00022HOMEDIR_REQUIRED (ต้องมีโฟลเดอร์หลัก)0x00088LOCKOUT (บัญชีถูกล็อก)0x001016PASSWD_NOTREQD (ไม่ต้องใช้รหัสผ่าน)0x002032PASSWD_CANT_CHANGE0x001016PASSWD_NOTREQD (ไม่ต้องใช้รหัสผ่าน)0x002032PASSWD_CANT_CHANGE0ป้องกันผู้ใช้จากการเปลี่ยนรหัสผ่านTTED64_Pย้อนกลับได้ การเข้ารหัส) 0x0080128TEMP_DUPLICATE_ACCOUNT (บัญชีของผู้ใช้ที่มีบัญชีหลักอยู่ในโดเมนอื่น) 0x0100256NORMAL_ACCOUNT (บัญชีเริ่มต้นเป็นบัญชีที่ใช้งานทั่วไป) 0x0200512INTERDOMAIN_TRUST_ACCOUNT0x08002048WORKSTATION_TRUST_ACCOUNT0x10004096SERVER_TRUST_ACCOUNT0x20008192DONT_EXPIRE_PASSWORD (บัญชีผู้ใช้ที่มีรหัสผ่านที่ไม่หมดอายุ) 0x1000065536MNS_LOGON_ACCOUNT0x20000131072SMARTCARD_REQUIRED (ในการเข้าสู่ระบบเครือข่าย ผู้ใช้ต้องการสมาร์ทการ์ด)0x40000262144TRUSTED_FOR_DELEGATION0x80000524288NOT_DELEGATED0x1000001048576USE_DES_KEY_ONLY0x200002097152DONT_REQ_PREAUTH (ไม่จำเป็นต้องมีการตรวจสอบสิทธิ์ล่วงหน้าของ Kerberos)0x400000 4194304PASSWORD_EXPIRED (รหัสผ่านผู้ใช้หมดอายุ)0x80000008388608TRUSTED_TO_AUTH_FOR_DELEGATION0x100000016777216PARTIAL_SECRETS_ACCOUNT0x0400000067108864ตัวอย่างเช่น มีบัญชีปกติที่ข้อกำหนดในการเปลี่ยนรหัสผ่านถูกปิดใช้งาน ค่า userAccountControl คำนวณดังนี้:
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) = 66048
ดังนั้น ค่าของ userAccountControl จากตัวอย่างของฉัน (66050) ได้มาดังนี้:
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) + ACCOUNTDISABLE (2) = 66050
บัญชีผู้ใช้ที่ถูกปิดใช้งานมี 514 เป็นค่า userAccountControl:
(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)"
รายการบัญชีที่มีตัวเลือกรหัสผ่านที่ไม่หมดอายุ:
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
อย่างที่คุณเห็น สคริปต์ได้ส่งคืนว่าแฟล็กต่อไปนี้ถูกเปิดใช้งานสำหรับผู้ใช้รายนี้:
ปิดบัญชี | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
สามารถใช้สคริปต์เดียวกันเพื่อถอดรหัสค่า UserAccountControl ได้ทันทีเมื่อรับข้อมูลเกี่ยวกับบัญชี AD ในรูปแบบที่สะดวกโดยใช้ cmdlet ของ Get-ADUser หรือ Get-ADComputer ตัวอย่างเช่น:
get-aduser ms-pam -properties *|select @{n='UsrAcCtrl';e={DecodeUserAccountControl($_.userAccountControl)}}
ปิดบัญชี | 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 โดยใช้ Set-ADUser และ Set-ADComputer PowerShell cmdlet cmdlet ทั้งสองนี้มีตัวเลือกแยกกัน เช่น:
- AccountNotDelegated
- AllowReversiblePasswordEncryption
- ไม่สามารถเปลี่ยนรหัสผ่านได้
- เปลี่ยนรหัสผ่าน AtLogon
- KerberosEncryptionType
- รหัสผ่านไม่มีวันหมดอายุ
- ไม่ต้องใช้รหัสผ่าน
- PrincipalsAllowedToDelegateToAccount
ดังนั้น ในการเปลี่ยนตัวเลือกผู้ใช้บางอย่าง คุณต้องใช้คำสั่งต่อไปนี้:
Set-ADUser jkelly –CannotChangePassword:$true -PasswordNeverExpires:$true
หรือคุณสามารถใช้ Set-UserAccountControl . ทั่วไป cmdlet:
Set-ADAccountControl -Identity jkelly -CannotChangePassword $True -PasswordNeverExpires $True
คุณยังสามารถเปิดใช้งานตัวเลือกบัญชีผู้ใช้ทั้งสองนี้ได้โดยตรงโดยการตั้งค่าที่แน่นอนผ่านแอตทริบิวต์ UserAccountControl:
Set-ADUser jkelly -Replace @{UserAccountControl= 66048}