এই আর্টিকেলে আমরা দেখাব PowerShell ব্যবহার করে Active Directory ইউজার অ্যাকাউন্টের পাসওয়ার্ড কখন এক্সপায়ার হবে সেটা কীভাবে জানব, পাসওয়ার্ড কখনো এক্সপায়ার না হওয়ার জন্য সেট করা (PasswordNeverExpires = True), এবং ইউজারদের আগে থেকে পাসওয়ার্ড চেঞ্জ করার জন্য নোটিফাই করা।
যদি ডোমেনে কোনো ইউজারের পাসওয়ার্ড এক্সপায়ার হয়ে যায়, তবে অ্যাকাউন্ট লক হয় না, কিন্তু সেটি ডোমেন রিসোর্স অ্যাক্সেস করতে ব্যবহার করা যাবে না যতক্ষণ না ইউজার এক্সপায়ারড পাসওয়ার্ড নতুন দিয়ে চেঞ্জ করে। রিমোট ইউজাররা সবচেয়ে বেশি এক্সপায়ারড পাসওয়ার্ড সমস্যায় পড়ে, কারণ তারা স্ট্যান্ডার্ড টুলস ব্যবহার করে পাসওয়ার্ড চেঞ্জ করতে পারে না।
ডোমেনে ইউজার পাসওয়ার্ড এক্সপায়ার টাইম লিমিট, কতদিন পর পাসওয়ার্ড চেঞ্জ করতে হবে (maximum password age) এবং কমপ্লেক্সিটি রিকোয়ারমেন্ট AD ডোমেন পাসওয়ার্ড পলিসিতে সেট করা থাকে। এই প্যারামিটারগুলো Default Domain Policy বা Fine-Grained Password Policy-তে সেট করা হয়।
ডোমেনে বর্তমান পাসওয়ার্ড এক্সপায়ারেশন পলিসি সেটিংস জানতে এই PowerShell কমান্ড ব্যবহার করুন:
Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge
আমার উদাহরণে ডোমেনে ইউজার পাসওয়ার্ডের সর্বোচ্চ আয়ু ৬০ দিন।

Active Directory-এ ইউজার পাসওয়ার্ড এক্সপায়ারেশন ডেট কীভাবে পাবেন?
কমান্ড প্রম্পটে Net user কমান্ড দিয়ে পাসওয়ার্ড আয়ু এবং শেষবার কখন চেঞ্জ করা হয়েছে সেটা দেখতে পারেন:
net user jsmith /domain

নিচের লাইনগুলোর তথ্য আপনার দরকার:
- Password last set — 9/9/2020 9:23:59 AM
- Password expires — 1/7/2021 9:23:59 AM
- Password changeable — 9/10/2020 9:23:59 AM
কোনো ইউজারের পাসওয়ার্ড এক্সপায়ারেশন ডেট জানতে পারেন। এর জন্য অ্যাডমিনিস্ট্রেটর প্রিভিলেজ বা AD কন্টেইনারের ডেলিগেটেড প্রিভিলেজ লাগে না।
AD অ্যাকাউন্টের সেটিংস দেখতে আমরা Active Directory মডিউলের জন্য বিশেষ PowerShell ব্যবহার করব যা বিভিন্ন AD অবজেক্ট অ্যাট্রিবিউটের মান পাওয়া যায় (Windows 10 এবং Windows Server 2012 R2/2016-এ AD PowerShell মডিউল ইনস্টল ও ইম্পোর্ট করার পদ্ধতি দেখুন)।
Get-ADUser কমান্ডলেট ব্যবহার করে ইউজারের পাসওয়ার্ড শেষবার কখন চেঞ্জ করা হয়েছে এবং PasswordNeverExpires অপশন সেট আছে কিনা চেক করা যায়:
get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired |ft Name, PasswordLastSet, PasswordNeverExpires,PasswordExpired

- PasswordLastSet হলো শেষ পাসওয়ার্ড চেঞ্জের তারিখ ও সময়;
- PasswordNeverExpires যদি ইউজার পাসওয়ার্ড কখনো এক্সপায়ার না হয় তবে True রিটার্ন করে;
- PasswordExpired – ইউজার পাসওয়ার্ড এক্সপায়ার হলে True, এক্সপায়ার না হলে False রিটার্ন করে।
গ্রাফিক্যাল MMC স্ন্যাপ-ইন Active Directory Users & Computers (dsa.msc) দিয়ে শেষ পাসওয়ার্ড চেঞ্জের টাইম চেক করা যায়। ইউজার প্রপার্টিজ খুলুন, Attribute Editor ট্যাবে যান এবং pwdLastSet অ্যাট্রিবিউটের মান চেক করুন।
তবে দেখুন, MMC স্ন্যাপ-ইন শুধু পাসওয়ার্ড চেঞ্জের টাইম দেখায়। পাসওয়ার্ড কখন এক্সপায়ার হবে সেটা বোঝা যায় না।

পাসওয়ার্ড চেঞ্জের টাইমের বদলে পাসওয়ার্ড এক্সপায়ারেশন ডেট পেতে একটি স্পেশাল কনস্ট্রাক্টেড AD অ্যাট্রিবিউট ব্যবহার করুন: msDS-UserPasswordExpiryTimeComputed। msDS-UserPasswordExpiryTimeComputed মানটি শেষ পাসওয়ার্ড চেঞ্জের তারিখ এবং ডোমেন পাসওয়ার্ড পলিসি বেসড করে অটোমেটিক্যালি ক্যালকুলেট হয়।
UserPasswordExpiryTimeComputed প্যারামিটারটি TimeStamp ফরম্যাটে ডেটা রিটার্ন করে, তাই মানব পাঠযোগ্য ভ্যালুতে কনভার্ট করার জন্য FromFileTime ফাংশন ব্যবহার করি:
Get-ADUser -Identity jsmith -Properties msDS-UserPasswordExpiryTimeComputed | select-object @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") }}
এভাবে আমরা ইউজার পাসওয়ার্ড এক্সপায়ারেশন ডেট পেয়েছি।

যদি msDS-UserPasswordExpiryTimeComputed-এর মান ০ হয়, তবে এর মানে pwdLastSet খালি (null) বা ০-এর সমান (পাসওয়ার্ড কখনো চেঞ্জ হয়নি)।
AD-এ নির্দিষ্ট কন্টেইনার (OU) থেকে সব ইউজারের পাসওয়ার্ড এক্সপায়ারেশন ডেট পেতে নিচের PowerShell স্ক্রিপ্ট ব্যবহার করুন:
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
$Users | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime ($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet
ফলাফলে এক্টিভ ইউজারদের তালিকা, এক্সপায়ারেশন ডেট এবং শেষ পাসওয়ার্ড চেঞ্জের টাইম সহ একটি টেবিল আসবে।

শুধু এক্সপায়ারড পাসওয়ার্ড والے ইউজারদের তালিকা দেখতে:
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
foreach($user in $Users){
if( [datetime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed") -lt (Get-Date)) {
$user.Name
}
}
AD ইউজার পাসওয়ার্ড কখনো এক্সপায়ার না হওয়ার জন্য সেট করা
আপনি যদি কোনো অ্যাকাউন্টের জন্য পারম্যানেন্ট পাসওয়ার্ড চান, AD-এ ইউজার প্রপার্টিজে Password Never Expires অপশন চেক করুন (এটি UserAccoutControl অ্যাট্রিবিউটের একটি বিট ভ্যালু)।

অথবা PowerShell দিয়ে ইউজার অ্যাট্রিবিউট সেট করে এই অপশন সক্রিয় করুন:
Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$True
একসাথে একাধিক ইউজারের জন্য (টেক্সট ফাইল থেকে লিস্ট নিয়ে) Password Never Expires অপশন সেট করুন:
$users=Get-Content "C:\PS\users_password_never_expire.txt"
Foreach ($user in $users) {
Set-ADUser $user -PasswordNeverExpires:$True
}
নিতান্ত পাসওয়ার্ড চেঞ্জ অপশন ডিজেবল করা সব ইউজারের তালিকা দেখুন:
Get-ADUser -filter * -properties Name, PasswordNeverExpires | where {$_.passwordNeverExpires -eq "true" } | Select-Object DistinguishedName,Name,Enabled |ft
Active Directory Password Expiration Notification Policy
Windows-এ একটি স্পেশাল Group Policy প্যারামিটার আছে যা ইউজারদের পাসওয়ার্ড চেঞ্জ করার জন্য নোটিফাই করে।
পলিসিটি নাম Interactive logon: Prompt user to change password before expiration এবং এটি অবস্থিত GPO সেকশনে: Computer Configuration → Policies → Windows Settings → Security Settings → Local Policies → Security Options।
ডিফল্টভাবে এই পলিসি লোকাল Windows সেটিংসে সক্রিয় থাকে, এবং পাসওয়ার্ড এক্সপায়ারের ৫ দিন আগে থেকে নোটিফিকেশন দেখানো শুরু হয়। ইউজাররা কতদিন আগে পাসওয়ার্ড চেঞ্জ নোটিফিকেশন দেখবে সেটি পরিবর্তন করা যায়।

এই পলিসি সক্রিয় করার পর, যদি ইউজারের পাসওয়ার্ড এক্সপায়ার হওয়ার কাছে থাকে, তবে লগ-অন করার সময় ট্রে-এ পাসওয়ার্ড চেঞ্জ নোটিফিকেশন আসবে।
Consider changing your password Your password will expire in xx days.

একটি সিম্পল PowerShell স্ক্রিপ্টও ব্যবহার করা যায় যা অটোমেটিক্যালি একটি ডায়ালগ উইন্ডো দেখাবে পাসওয়ার্ড চেঞ্জ করার প্রম্পটসহ যদি পাসওয়ার্ড ৫ দিনের কমে এক্সপায়ার হওয়ার কাছে থাকে:
Add-Type -AssemblyName PresentationFramework
$curruser= Get-ADUser -Identity $env:username -Properties 'msDS-UserPasswordExpiryTimeComputed','PasswordNeverExpires'
if ( -not $curruser.'PasswordNeverExpires') {
$timediff=(new-timespan -start (get-date) -end ([datetime]::FromFileTime($curruser."msDS-UserPasswordExpiryTimeComputed"))).Days
if ($timediff -lt 5) {
$msgBoxInput = [System.Windows.MessageBox]::Show("Your password expires in "+ $timediff + " days!`nDo you want to change it now?","Important!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
cmd /c "explorer shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}"
}
'No' { }
}
}
}
যদি ইউজার YES ক্লিক করে, তবে Windows Security উইন্ডো আসবে যা Ctrl+Alt+Del বা Ctrl+Alt+End (RDP/RDS কানেকশনের কেসে) চাপলে দেখা যায়।

স্ক্রিপ্টটি ধরে নিচ্ছে যে ইউজারদের কম্পিউটারে PowerShell for AD মডিউল ইনস্টল করা আছে। RSAT ইনস্টল না থাকলেও এটি ব্যবহার করা যায়। "Using AD module without installing RSAT" আর্টিকেলটি চেক করুন।
PS স্ক্রিপ্টকে অটোমেটিক স্টার্টআপে সক্ষম করুন বা GPO লগ-অন স্ক্রিপ্ট হিসেবে চালান।
PowerShell দিয়ে পাসওয়ার্ড এক্সপায়ারেশন ইমেইল নোটিফিকেশন
আপনি যদি ইমেইল দিয়ে ইউজারদের পাসওয়ার্ড এক্সপায়ারেশন সম্পর্কে নোটিফাই করতে চান, তবে এই PowerShell স্ক্রিপ্ট ব্যবহার করুন:
$Sender = "info@woshub.com"
$Subject = 'Important! Your password expires soon!'
$BodyTxt1 = 'Your password for'
$BodyTxt2 = 'expires in '
$BodyTxt3 = 'days. Remember to change your password in advance. If you have other questions, contact the HelpDesk.'
$smtpserver ="smtp.woshub.com"
$warnDays = (get-date).adddays(7)
$2Day = get-date
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, EmailAddress, Name | select Name, @{Name ="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, EmailAddress
foreach ($user in $users) {
if (($user.ExpirationDate -lt $warnDays) -and ($2Day -lt $user.ExpirationDate) ) {
$lastdays = ( $user.ExpirationDate -$2Day).days
$EmailBody = $BodyTxt1, $user.name, $BodyTxt2, $lastdays, $BodyTxt3 -join ' '
Send-MailMessage -To $user.EmailAddress -From $Sender -SmtpServer $smtpserver -Subject $Subject -Body $EmailBody
}
}
স্ক্রিপ্টটি সব এক্টিভ ডোমেন ইউজার চেক করে যাদের পাসওয়ার্ড এক্সপায়ার হওয়ার কাছে আছে। পাসওয়ার্ড এক্সপায়ারের ৭ দিন আগে থেকে ইউজারকে AD-এ স্পেসিফাই করা ইমেইল ঠিকানায় ইমেইল পাঠানো শুরু হয়। পাসওয়ার্ড চেঞ্জ হয় না বা এক্সপায়ার না হয় পর্যন্ত ইমেইল পাঠানো থাকে।
এডমিনিস্ট্রেটর Set-ADAccountPassword কমান্ডলেট দিয়ে ইউজার পাসওয়ার্ড চেঞ্জ ফোর্স করতে পারেন।
এই PowerShell স্ক্রিপ্ট আপনার ডোমেনে যেকোনো কম্পিউটার/সার্ভারে নিয়মিত চালান (Task Scheduler দিয়ে করা সহজ)। অবশ্য আপনাকে ইমেইল পাঠানো হোস্টের IP ঠিকানা আপনার SMTP সার্ভারে allowed senders লিস্টে যোগ করতে হবে (অথেন্টিকেশন ছাড়া ইমেইল পাঠাতে পারে)।