Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

การแปลงค่าแอตทริบิวต์ UserAccountControl ใน Active Directory

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 (การรันสคริปต์ล็อกอิน)0x00011
ACCOUNTDISABLE (บัญชีถูกปิดใช้งาน)0x00022
HOMEDIR_REQUIRED (ต้องการโฟลเดอร์โฮม)0x00088
LOCKOUT (บัญชีถูกล็อก)0x001016
PASSWD_NOTREQD (ไม่ต้องการรหัสผ่าน)0x002032
PASSWD_CANT_CHANGE (ป้องกันไม่ให้ผู้ใช้เปลี่ยนรหัสผ่าน)0x004064
ENCRYPTED_TEXT_PWD_ALLOWED (อนุญาตจัดเก็บรหัสผ่านแบบเข้ารหัสกลับกันได้)0x0080128
TEMP_DUPLICATE_ACCOUNT (บัญชีผู้ใช้ซ้ำชั่วคราว)0x0100256
NORMAL_ACCOUNT (บัญชีปกติ บัญชีทั่วไปที่ใช้งานอยู่)0x0200512
INTERDOMAIN_TRUST_ACCOUNT0x08002048
WORKSTATION_TRUST_ACCOUNT0x10004096
SERVER_TRUST_ACCOUNT0x20008192
DONT_EXPIRE_PASSWORD (บัญชีผู้ใช้ที่รหัสผ่านไม่หมดอายุ)0x1000065536
MNS_LOGON_ACCOUNT0x20000131072
SMARTCARD_REQUIRED (ต้องใช้สมาร์ทการ์ดเพื่อล็อกอินเครือข่าย)0x40000262144
TRUSTED_FOR_DELEGATION0x80000524288
NOT_DELEGATED0x1000001048576
USE_DES_KEY_ONLY0x2000002097152
DONT_REQ_PREAUTH (ไม่ต้องการการรับรองความถูกต้องล่วงหน้า Kerberos)0x4000004194304
PASSWORD_EXPIRED (รหัสผ่านผู้ใช้หมดอายุ)0x8000008388608
TRUSTED_TO_AUTH_FOR_DELEGATION0x100000016777216
PARTIAL_SECRETS_ACCOUNT0x0400000067108864

เช่น มีบัญชีทั่วไปที่ปิดใช้งานข้อกำหนดการเปลี่ยนรหัสผ่าน ค่า 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}