Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Chuyển đổi giá trị thuộc tính UserAccountControl trong Active Directory

UserAccountControl là một trong những thuộc tính quan trọng nhất của đối tượng người dùng và máy tính trong Active Directory. Thuộc tính này xác định trạng thái tài khoản trong domain AD: tài khoản đang hoạt động hay bị khóa, tùy chọn thay đổi mật khẩu tại lần đăng nhập tiếp theo có được bật hay không, người dùng có thể thay đổi mật khẩu của họ, v.v. Tuy nhiên, không phải tất cả quản trị viên đều hiểu rõ cách thức hoạt động của thuộc tính UserAccountControl và nó được sử dụng như thế nào trong AD.

Thuộc tính/Cờ UserAccountControl trong Active Directory

Mở thuộc tính của bất kỳ tài khoản AD nào trong bảng điều khiển Active Directory Users and Computers (ADUC, dsa.msc) và chuyển sang tab Account. Hãy chú ý đến nhóm thuộc tính người dùng trong phần Account Options. Ở đây bạn có thể thấy các tùy chọn sau:

  • User must change password at next logon (Người dùng phải thay đổi mật khẩu tại lần đăng nhập tiếp theo);
  • User cannot change password (Người dùng không thể thay đổi mật khẩu);
  • Password never expires (Mật khẩu không bao giờ hết hạn); Theo mặc định, chính sách mật khẩu domain trong AD yêu cầu người dùng thay đổi mật khẩu định kỳ.
  • Store password using reversible encryption (Lưu mật khẩu bằng mã hóa có thể đảo ngược - không an toàn);
  • Account is disabled (Tài khoản bị vô hiệu hóa);
  • Smart card is required for interactive logon (Yêu cầu thẻ thông minh để đăng nhập tương tác);
  • Account is sensitive and cannot be delegated (Tài khoản nhạy cảm và không thể ủy quyền);
  • Use Kerberos DES encryption types for this account (Sử dụng loại mã hóa Kerberos DES cho tài khoản này);
  • This account supports Kerberos AES 128/256-bit encryption (Tài khoản này hỗ trợ mã hóa Kerberos AES 128/256-bit);
  • Do not require Kerberos Pre-authentication (Không yêu cầu tiền xác thực Kerberos).

Chuyển đổi giá trị thuộc tính UserAccountControl trong Active Directory

Mỗi thuộc tính tài khoản người dùng ở trên về cơ bản là một giá trị bit (cờ) có thể là 1 (True) hoặc 0 (False). Tuy nhiên, các giá trị này không được lưu trữ dưới dạng các thuộc tính AD riêng biệt, mà thuộc tính UserAccountControl được sử dụng.

Tổng giá trị của tất cả các tùy chọn được chỉ định ở trên được lưu trữ trong giá trị của thuộc tính UserAccountControl. Thay vì lưu trữ tất cả các tùy chọn này trong các thuộc tính người dùng khác nhau, một thuộc tính Active Directory duy nhất được sử dụng. UserAccountControl là một bitmask, mỗi bit của nó là một cờ riêng biệt và có giá trị On (True) hoặc Off (False). Tùy thuộc vào các tùy chọn tài khoản được bật, người dùng sẽ có các giá trị thuộc tính UserAccountControl khác nhau. Bạn có thể xem giá trị hiện tại của thuộc tính trong tab Attribute Editor tương ứng hoặc bằng cmdlet Get-ADUser trong PowerShell:

get-aduser jkelly -properties *|select name,UserAccountControl | ft

Chuyển đổi giá trị thuộc tính UserAccountControl trong Active Directory

Chuyển đổi giá trị thuộc tính UserAccountControl trong Active Directory

Trong ví dụ này, giá trị thuộc tính là 0x10202 (giá trị thập phân là 66050).那些数字是什么意思?

Bảng các cờ có sẵn của tài khoản AD được đưa ra bên dưới. Mỗi cờ tương ứng với một bit nhất định của UserAccountControl, và giá trị UserAccountControl bằng tổng của tất cả các cờ.

UserAccountControl Flag HEX Value Decimal Value
SCRIPT (Chạy script đăng nhập)0x00011
ACCOUNTDISABLE (Tài khoản bị vô hiệu hóa)0x00022
HOMEDIR_REQUIRED (Yêu cầu thư mục chủ)0x00088
LOCKOUT (Tài khoản bị khóa)0x001016
PASSWD_NOTREQD (Không yêu cầu mật khẩu)0x002032
PASSWD_CANT_CHANGE (Ngăn người dùng thay đổi mật khẩu)0x004064
ENCRYPTED_TEXT_PWD_ALLOWED (Cho phép lưu mật khẩu bằng mã hóa có thể đảo ngược)0x0080128
TEMP_DUPLICATE_ACCOUNT (Tài khoản của người dùng có tài khoản chính trong domain khác)0x0100256
NORMAL_ACCOUNT (Tài khoản mặc định, tài khoản hoạt động điển hình)0x0200512
INTERDOMAIN_TRUST_ACCOUNT0x08002048
WORKSTATION_TRUST_ACCOUNT0x10004096
SERVER_TRUST_ACCOUNT0x20008192
DONT_EXPIRE_PASSWORD (Tài khoản người dùng với mật khẩu không hết hạn)0x1000065536
MNS_LOGON_ACCOUNT0x20000131072
SMARTCARD_REQUIRED (Để đăng nhập mạng, người dùng cần thẻ thông minh)0x40000262144
TRUSTED_FOR_DELEGATION0x80000524288
NOT_DELEGATED0x1000001048576
USE_DES_KEY_ONLY0x2000002097152
DONT_REQ_PREAUTH (Không yêu cầu tiền xác thực Kerberos)0x4000004194304
PASSWORD_EXPIRED (Mật khẩu người dùng đã hết hạn)0x8000008388608
TRUSTED_TO_AUTH_FOR_DELEGATION0x100000016777216
PARTIAL_SECRETS_ACCOUNT0x0400000067108864

Ví dụ, có một tài khoản thông thường mà yêu cầu thay đổi mật khẩu bị vô hiệu hóa. Giá trị userAccountControl được tính như sau:

NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) = 66048

Theo đó, giá trị userAccountControl từ ví dụ của tôi (66050) được đạt được như sau:

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

Tài khoản người dùng bị vô hiệu hóa có giá trị userAccountControl là 514:

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

Giá trị UserAccountControl mặc định cho các đối tượng domain điển hình:

  • Người dùng AD thông thường: 0x200 (512);
  • Bộ điều khiển domain: 0x82000 (532480);
  • Trạm làm việc/máy chủ: 0x1000 (4096).

Bạn có thể sử dụng bộ lọc LDAP để chọn các đối tượng từ AD với một giá trị useraccountcontrol nhất định. Ví dụ, để hiển thị tất cả các tài khoản hoạt động (bình thường):

Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=512)"

Hiển thị danh sách tất cả tài khoản người dùng bị vô hiệu hóa:

Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=514)"

Danh sách các tài khoản với tùy chọn mật khẩu không hết hạn:

Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=66048)"

Bạn có thể cộng các bit cần thiết từ bảng và chọn đối tượng AD bằng lệnh:

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

Giải mã giá trị UserAccountControl với script PowerShell

Để thuận tiện hơn, tôi muốn có một công cụ tự động chuyển đổi giá trị bitmask UserAccountControl thành dạng con người dễ hiểu. Hãy thử viết một hàm PowerShell đơn giản nhận giá trị thập phân của thuộc tính UserAccountControl và trả về danh sách các tùy chọn tài khoản được bật. Vì UserAccountControl là một bitmask, bạn có thể gán mô tả văn bản cho từng bit.

Tôi đã viết hàm PowerShell DecodeUserAccountControl để chuyển đổi giá trị UserAccountControl thành dạng dễ đọc:

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 " | "
}

Kiểm tra xem giá trị 66050 của UserAccountControl có nghĩa gì:

DecodeUserAccountControl 66050

Như bạn thấy, script đã trả về các cờ sau được bật cho người dùng này:

ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD

Chuyển đổi giá trị thuộc tính UserAccountControl trong Active Directory

Cùng script này có thể được sử dụng để giải mã giá trị UserAccountControl ngay lập tức khi lấy thông tin về tài khoản AD trong dạng thuận tiện bằng cmdlet Get-ADUser hoặc Get-ADComputer, ví dụ:

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

Chuyển đổi giá trị thuộc tính UserAccountControl trong Active Directory

Cách thiết lập thuộc tính UserAccountControl trong AD bằng PowerShell?

Bạn có thể thay đổi các tùy chọn riêng lẻ của thuộc tính UserAccountControl trong Active Directory bằng cmdlet PowerShell Set-ADUser và Set-ADComputer. Cả hai cmdlet này đều có các tùy chọn riêng biệt, ví dụ:

  • AccountNotDelegated
  • AllowReversiblePasswordEncryption
  • CannotChangePassword
  • ChangePasswordAtLogon
  • KerberosEncryptionType
  • PasswordNeverExpires
  • PasswordNotRequired
  • PrincipalsAllowedToDelegateToAccount

Mật khẩu tài khoản máy tính trong AD cung cấp mối quan hệ tin cậy giữa máy tính và domain.

Vì vậy, để thay đổi một số tùy chọn người dùng, bạn cần sử dụng lệnh sau:

Set-ADUser jkelly –CannotChangePassword:$true -PasswordNeverExpires:$true

Hoặc bạn có thể sử dụng cmdlet chung Set-ADAccountControl:

Set-ADAccountControl -Identity jkelly -CannotChangePassword $True -PasswordNeverExpires $True

Chuyển đổi giá trị thuộc tính UserAccountControl trong Active Directory

Bạn cũng có thể bật cả hai tùy chọn tài khoản người dùng này trực tiếp bằng cách đặt giá trị chính xác thông qua thuộc tính UserAccountControl:

Set-ADUser jkelly -Replace @{UserAccountControl= 66048}