ในบทความนี้เราจะแสดงวิธีค้นหาว่ารหัสผ่านของบัญชีผู้ใช้ Active Directory จะหมดอายุเมื่อไหร่โดยใช้ PowerShell วิธีตั้งค่ารหัสผ่านให้ไม่มีวันหมดอายุ (PasswordNeverExpires = True) และการแจ้งเตือนผู้ใช้ล่วงหน้าให้เปลี่ยนรหัสผ่าน
หากรหัสผ่านของผู้ใช้ในโดเมนหมดอายุ บัญชีนั้นจะไม่ถูกล็อก แต่ไม่สามารถใช้เพื่อเข้าถึงทรัพยากรโดเมนได้จนกว่าผู้ใช้จะเปลี่ยนรหัสผ่านที่หมดอายุเป็นรหัสใหม่ บ่อยครั้งที่ผู้ใช้ระยะไกลเผชิญปัญหากับรหัสผ่านที่หมดอายุ เนื่องจากพวกเขาไม่สามารถเปลี่ยนรหัสผ่านได้โดยใช้เครื่องมือมาตรฐาน
เวลาหมดอายุของรหัสผ่านผู้ใช้ในโดเมน ความถี่ในการเปลี่ยน (Maximum Password Age) และข้อกำหนดด้านความซับซ้อน ถูกตั้งค่าในนโยบายรหัสผ่านโดเมนของ AD พารามิเตอร์เหล่านี้ถูกตั้งค่าใน Default Domain Policy หรือ Fine-Grained Password Policy
คุณสามารถรับการตั้งค่านโยบายรหัสผ่านโดเมนปัจจุบันได้โดยใช้คำสั่ง PowerShell นี้:
Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge
ในตัวอย่างของเรา อายุสูงสุดของรหัสผ่านผู้ใช้ในโดเมนคือ 60 วัน

วิธีรับวันที่หมดอายุรหัสผ่านของผู้ใช้ใน Active Directory
คุณสามารถดูอายุรหัสผ่านและวันที่เปลี่ยนล่าสุดใน Command Prompt โดยใช้คำสั่ง 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
คุณสามารถรับวันที่หมดอายุรหัสผ่านสำหรับผู้ใช้รายใดได้ ในการทำเช่นนั้น คุณไม่ต้องการสิทธิ์แอดมินหรือสิทธิ์ที่มอบหมายบน Container AD ที่มีบัญชีผู้ใช้
เพื่อดูการตั้งค่าบัญชี AD เราจะใช้โมดูล PowerShell สำหรับ Active Directory พิเศษที่อนุญาตให้รับค่าของแอตทริบิวต์วัตถุ AD ต่างๆ (ดูวิธีติดตั้งและนำเข้าโมดูล AD PowerShell ใน Windows 10 และ Windows Server 2012 R2/2016)
โดยใช้ Cmdlet 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 เป็น 0 หมายถึง pwdLastSet ว่าง (null) หรือเท่ากับ 0 (รหัสผ่านไม่เคยถูกเปลี่ยน)
เพื่อรับวันที่หมดอายุรหัสผ่านสำหรับผู้ใช้ทั้งหมดจาก Container (OU) เฉพาะใน AD คุณสามารถใช้สคริปต์ 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 User ให้ไม่มีวันหมดอายุ
หากคุณต้องการตั้งค่ารหัสผ่านถาวรสำหรับบัญชี ให้ติ๊กตัวเลือก Password Never Expires ในคุณสมบัติผู้ใช้ใน AD (เป็นหนึ่งในค่า Bit ของแอตทริบิวต์ UserAccountControl)

หรือคุณสามารถเปิดใช้งานตัวเลือกนี้ด้วย 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
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 ท้องถิ่น และการแจ้งเตือนเริ่มปรากฏ 5 วันก่อนรหัสผ่านหมดอายุ คุณสามารถเปลี่ยนจำนวนวันที่ผู้ใช้จะเห็นการแจ้งเตือนเปลี่ยนรหัสผ่าน

หลังจากเปิดใช้งานโพลิซีนี้ หากรหัสผ่านของผู้ใช้ใกล้หมดอายุ การแจ้งเตือนให้เปลี่ยนรหัสผ่านจะปรากฏใน System Tray ทุกครั้งที่ผู้ใช้เข้าสู่ระบบ
Consider changing your password Your password will expire in xx days.

คุณยังสามารถใช้สคริปต์ PowerShell เรียบง่ายที่แสดงหน้าต่าง Dialog พร้อมพรอมต์ให้เปลี่ยนรหัสผ่านโดยอัตโนมัติ หากหมดอายุในน้อยกว่า 5 วัน:
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 สำหรับ AD ติดตั้งอยู่บนคอมพิวเตอร์ผู้ใช้ สามารถใช้ได้แม้ RSAT จะไม่ได้ติดตั้ง ตรวจสอบบทความ "Using AD module without installing RSAT"
เปิดใช้งานการเริ่มต้นอัตโนมัติสำหรับสคริปต์ PS หรือรันมันเป็น GPO Logon Script
การแจ้งเตือนหมดอายุรหัสผ่านทางอีเมลผ่าน 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
}
}
สคริปต์ตรวจสอบผู้ใช้โดเมนที่ใช้งานอยู่ทั้งหมดที่รหัสผ่านใกล้หมดอายุ 7 วันก่อนวันหมดอายุ ผู้ใช้จะเริ่มได้รับอีเมลที่ส่งไปยังที่อยู่อีเมลที่ระบุใน AD อีเมลจะส่งต่อไปจนกว่าจะเปลี่ยนรหัสผ่านหรือหมดอายุ
ผู้ดูแลระบบสามารถบังคับให้ผู้ใช้เปลี่ยนรหัสผ่านโดยใช้ Cmdlet Set-ADAccountPassword
รันสคริปต์ PowerShell นี้เป็นประจำบนคอมพิวเตอร์/เซิร์ฟเวอร์ใดๆ ในโดเมนของคุณ (ง่ายกว่าที่จะทำด้วย Task Scheduler) โดยปبع คุณจะต้องเพิ่มที่อยู่ IP ของโฮสต์ที่ส่งอีเมลไปยังรายการผู้ส่งที่อนุญาต (สามารถส่งอีเมลได้โดยไม่ต้องยืนยันตัวตน) บน SMTP Server ของคุณ