UserAccountControl এক্টিভ ডিরেক্টরিতে ব্যবহারকারী এবং কম্পিউটার অবজেক্টের সবচেয়ে গুরুত্বপূর্ণ অ্যাট্রিবিউটের একটি। এই অ্যাট্রিবিউট AD ডোমেইনে অ্যাকাউন্টের অবস্থা নির্ধারণ করে: অ্যাকাউন্ট সক্রিয় কিনা বা লক করা আছে, পরবর্তী লগ-ইনে পাসওয়ার্ড পরিবর্তন বাধ্যতামূলক কিনা, ব্যবহারকারীরা পাসওয়ার্ড পরিবর্তন করতে পারবেন কিনা, ইত্যাদি। তবে সব অ্যাডমিনিস্ট্রেটর UserAccountControl অ্যাট্রিবিউট কীভাবে কাজ করে এবং AD-তে এর ব্যবহার সম্পর্কে সম্পূর্ণভাবে অবগত নন।
এক্টিভ ডিরেক্টরিতে UserAccountControl অ্যাট্রিবিউট/ফ্ল্যাগ
ADUC (dsa.msc) কনসোলে যেকোনো AD অ্যাকাউন্টের প্রপার্টি খুলুন এবং Account ট্যাবে যান। Account Options সেকশনে ব্যবহারকারীর অ্যাট্রিবিউটের গ্রুপে নিচের অপশনগুলো দেখবেন:
- User must change password at next logon (পরবর্তী লগ-ইনে পাসওয়ার্ড পরিবর্তন বাধ্যতামূলক);
- User cannot change password (ব্যবহারকারী পাসওয়ার্ড পরিবর্তন করতে পারবেন না);
- Password never expires (পাসওয়ার্ড কখনো মেয়াদোত্তীর্ণ হবে না); ডিফল্টভাবে AD-তে ডোমেইন পাসওয়ার্ড পলিসি ব্যবহারকারীকে время-सময়ে পাসওয়ার্ড পরিবর্তন করতে বাধ্য করে।
- Store password using reversible encryption (নিরাপদ নয়);
- Account is disabled (অ্যাকাউন্ট নিষ্ক্রিয়);
- Smart card is required for interactive logon (ইন্টারেক্টিভ লগ-ইনের জন্য স্মার্ট কার্ড বাধ্যতামূলক);
- Account is sensitive and cannot be delegated (অ্যাকাউন্ট সংবেদনশীল এবং ডেলিগেট করা যাবে না);
- Use Kerberos DES encryption types for this account (এই অ্যাকাউন্টের জন্য কেরবেরোস DES এনক্রিপশন টাইপ ব্যবহার করুন);
- This account supports Kerberos AES 128/256-bit encryption (এই অ্যাকাউন্ট কেরবেরোস AES 128/256-বিট এনক্রিপশন সমর্থন করে);
- Do not require Kerberos Pre-authentication (কেরবেরোস প্রি-অথেন্টিকেশন প্রয়োজন নেই)।

উপরোক্ত ব্যবহারকারী অ্যাকাউন্ট অ্যাট্রিবিউটের প্রতিটি মূলত একটি বিট মান (ফ্ল্যাগ) যা ১ (True) বা ০ (False) হতে পারে। তবে এই মানগুলো আলাদা AD অ্যাট্রিবিউট হিসেবে সংরক্ষিত হয় না, বরং UserAccountControl অ্যাট্রিবিউট ব্যবহার করা হয়।
উপরোক্ত সব অপশনের মোট মান UserAccountControl অ্যাট্রিবিউটের ভ্যালুতে সংরক্ষিত থাকে। এই সব অপশন আলাদা আলাদা ব্যবহারকারী অ্যাট্রিবিউটে না রাখে একক এক্টিভ ডিরেক্টরি অ্যাট্রিবিউট ব্যবহার করা হয়। UserAccountControl একটি বিটমাস্ক, যার প্রতিটি বিট একটি পৃথক ফ্ল্যাগ এবং এর মান On (True) বা Off (False)। সক্রিয় অ্যাকাউন্ট অপশনের উপর ভিত্তি করে ব্যবহারকারীর UserAccountControl অ্যাট্রিবিউট মান ভিন্ন হবে। আপনি Attribute Editor ট্যাবে বা পাওয়ারশেলে Get-ADUser কমান্ডলেট ব্যবহার করে বর্তমান মান দেখতে পারেন:
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 (কেরবেরোস প্রি-অথেন্টিকেশন প্রয়োজন নেই) | 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 মান ৫১৪:
(NORMAL_ACCOUNT (512)+ ACCOUNTDISABLE (2) = 514
ডোমেইন অবজেক্টের জন্য টিপিক্যাল ডিফল্ট UserAccountControl মান:
- সাধারণ AD ব্যবহারকারী: 0x200 (512);
- ডোমেইন কন্ট্রোলার: 0x82000 (532480);
- ওয়ার্কস্টেশন/সার্ভার: 0x1000 (4096)।
আপনি নির্দিষ্ট useraccountcontrol মানवाले AD অবজেক্ট সিলেক্ট করতে LDAP ফিল্টার ব্যবহার করতে পারেন। উদাহরণস্বরূপ, সব সক্রিয় (নর্মাল) অ্যাকাউন্ট দেখতে:
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 মান ডিকোড করা
সুবিধার্থে, UserAccountControl বিটমাস্কের মানকে মানুষের বোঝার योग্য ফর্মে রূপান্তর করার একটি টুল চাই। UserAccountControl একটি বিটমাস্ক হওয়ায়, প্রতিটি বিটের জন্য একটি টেক্সট বর্ণনা অ্যাসাইন করা যায়।
আমি 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 ” | ”
}
UserAccountControl মান ৬৬০৫০ কী বোঝাচ্ছে তা চেক করুন:
DecodeUserAccountControl 66050
দেখুন, স্ক্রিপ্টটি রিটার্ন করেছে যে এই ব্যবহারকারীর জন্য নিচের ফ্ল্যাগগুলো সক্রিয়:
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD

এই স্ক্রিপ্টটি Get-ADUser বা Get-ADComputer কমান্ডলেট দিয়ে AD অ্যাকাউন্টের তথ্য সুবিধাজনক ফর্মে পাওয়ার সময় UserAccountControl মান অন-দ-ফ্লাই ডিকোড করতে ব্যবহার করা যাবে, যেমন:
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

পাওয়ারশেল দিয়ে AD-তে UserAccountControl অ্যাট্রিবিউট সেট করা
Set-ADUser এবং Set-ADComputer পাওয়ারশেল কমান্ডলেট ব্যবহার করে UserAccountControl অ্যাট্রিবিউটের পৃথক অপশন পরিবর্তন করা যায়। এই দুটি কমান্ডলেটের আলাদা অপশন আছে, যেমন:
- 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}