ในบทความนี้ เราจะแสดงวิธีค้นหาเมื่อรหัสผ่านของบัญชีผู้ใช้ Active Directory หมดอายุโดยใช้ PowerShell วิธีตั้งรหัสผ่านให้ไม่มีวันหมดอายุ (PasswordNeverExpires = True
) และแจ้งให้ผู้ใช้ทราบล่วงหน้าเพื่อเปลี่ยนรหัสผ่าน
หากรหัสผ่านผู้ใช้ในโดเมนหมดอายุ บัญชีจะไม่ถูกล็อค แต่จะไม่สามารถใช้เพื่อเข้าถึงทรัพยากรของโดเมนได้จนกว่าผู้ใช้จะเปลี่ยนรหัสผ่านที่หมดอายุเป็นรหัสผ่านใหม่ ผู้ใช้ระยะไกลส่วนใหญ่มักประสบปัญหาเกี่ยวกับรหัสผ่านที่หมดอายุ เนื่องจากไม่สามารถเปลี่ยนรหัสผ่านโดยใช้เครื่องมือมาตรฐานได้
การจำกัดเวลาหมดอายุของรหัสผ่านผู้ใช้ในโดเมน ความถี่ที่ต้องเปลี่ยน (อายุรหัสผ่านสูงสุด) และข้อกำหนดความซับซ้อนถูกกำหนดไว้ในนโยบายรหัสผ่านโดเมน AD พารามิเตอร์เหล่านี้ได้รับการตั้งค่าในนโยบายโดเมนเริ่มต้นหรือนโยบายรหัสผ่านแบบละเอียด
คุณสามารถรับการตั้งค่านโยบายการหมดอายุของรหัสผ่านปัจจุบันในโดเมนได้โดยใช้คำสั่ง PowerShell:
Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge
ในตัวอย่างของเรา อายุรหัสผ่านของผู้ใช้สูงสุดในโดเมนคือ 60 วัน
วิธีรับวันหมดอายุรหัสผ่านผู้ใช้ใน Active Directory
คุณสามารถดูอายุรหัสผ่านและวันที่เมื่อมีการเปลี่ยนแปลงครั้งล่าสุดในพรอมต์คำสั่งโดยใช้ ผู้ใช้เน็ต คำสั่ง:
net user jsmith /domain
คุณสามารถค้นหาข้อมูลที่คุณต้องการได้ในบรรทัดเหล่านี้:
- รหัสผ่านชุดสุดท้าย — 9/9/2020 09:23:59 น.
- รหัสผ่านหมดอายุ — 1/7/2021 09:23:59 น.
- เปลี่ยนรหัสผ่านได้ — 9/10/2020 09:23:59 น.
ในการดูการตั้งค่าของบัญชี AD เราจะใช้โมดูล PowerShell พิเศษสำหรับ Active Directory ที่ช่วยให้คุณได้รับค่าของแอตทริบิวต์ AD วัตถุต่างๆ (ดูวิธีการติดตั้งและนำเข้าโมดูล AD PowerShell ใน Windows 10 และ Windows Server 2012 R2 / 2016 ).
เมื่อใช้ Get-ADUser cmdlet คุณสามารถดูวันที่ที่รหัสผ่านของผู้ใช้ถูกเปลี่ยนครั้งสุดท้ายและตรวจสอบว่าได้ตั้งค่าตัวเลือก PasswordNeverExpires ไว้หรือไม่:
get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired |ft Name, PasswordLastSet, PasswordNeverExpires,PasswordExpired
- PasswordLastSet คือวันที่และเวลาที่เปลี่ยนรหัสผ่านครั้งล่าสุด
- รหัสผ่านไม่มีวันหมดอายุ คืนค่า จริง หากรหัสผ่านของผู้ใช้ไม่มีวันหมดอายุ
- รหัสผ่านหมดอายุ – หากรหัสผ่านของผู้ใช้หมดอายุ จะส่งกลับ True หากรหัสผ่านยังไม่หมดอายุ จะส่งกลับ False .
dsa.msc
). ในการดำเนินการ ให้เปิดคุณสมบัติของผู้ใช้ ไปที่แท็บ Attribute Editor แล้วตรวจสอบค่าของ pwdLastSet แอตทริบิวต์ แต่อย่างที่คุณเห็น MMC snap-in จะแสดงเฉพาะเวลาที่เปลี่ยนรหัสผ่านเท่านั้น ไม่ชัดเจนเมื่อรหัสผ่านหมดอายุ
ในการรับวันหมดอายุของรหัสผ่านแทนที่จะเป็นเวลาที่มีการเปลี่ยนแปลงล่าสุด ให้ใช้แอตทริบิวต์ 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 (รหัสผ่านไม่เคยเปลี่ยน)
ในการรับวันหมดอายุของรหัสผ่านสำหรับผู้ใช้ทั้งหมดจากคอนเทนเนอร์เฉพาะ (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 ให้ไม่มีวันหมดอายุ
หากคุณต้องการตั้งรหัสผ่านถาวรสำหรับบัญชี ให้ตรวจสอบ รหัสผ่านไม่มีวันหมดอายุ ตัวเลือกในคุณสมบัติผู้ใช้ใน AD (เป็นหนึ่งในค่าบิตของแอตทริบิวต์ UserAccoutControl)
หรือคุณสามารถเปิดใช้งานตัวเลือกนี้ด้วย PowerShell โดยการตั้งค่าแอตทริบิวต์ผู้ใช้:
Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$True
คุณสามารถตั้งค่าตัวเลือกรหัสผ่านไม่มีวันหมดอายุพร้อมกันสำหรับผู้ใช้หลายรายจากรายการในไฟล์ข้อความ:
$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 พิเศษที่ช่วยให้แจ้งเตือนผู้ใช้ว่าต้องเปลี่ยนรหัสผ่าน
นโยบายนี้เรียกว่า การเข้าสู่ระบบแบบโต้ตอบ:แจ้งให้ผู้ใช้เปลี่ยนรหัสผ่านก่อนหมดอายุ และอยู่ภายใต้ส่วน GPO:Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options
โดยค่าเริ่มต้น นโยบายจะเปิดใช้งานในการตั้งค่า Windows ในเครื่อง และการแจ้งเตือนจะเริ่มปรากฏ 5 วันก่อนรหัสผ่านจะหมดอายุ คุณสามารถเปลี่ยนจำนวนวันที่ผู้ใช้จะเห็นการแจ้งเตือนการเปลี่ยนรหัสผ่านได้
หลังจากเปิดใช้นโยบายนี้ หากรหัสผ่านของผู้ใช้หมดอายุ การแจ้งเตือนให้เปลี่ยนรหัสผ่านจะปรากฏในถาดทุกครั้งที่ผู้ใช้เข้าสู่ระบบ
Consider changing your password Your password will expire in xx days.
คุณยังสามารถใช้สคริปต์ PowerShell แบบง่ายที่แสดงหน้าต่างโต้ตอบโดยอัตโนมัติพร้อมข้อความแจ้งให้เปลี่ยนรหัสผ่านหากหมดอายุภายใน 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 จะปรากฏขึ้นหลังจากที่คุณกด Ctrl+Alt+Del
หรือ Ctrl+Alt+End
(ในกรณีของการเชื่อมต่อ RDP/RDS)
สคริปต์บอกเป็นนัยว่ามีการติดตั้งโมดูล PowerShell for AD บนคอมพิวเตอร์ของผู้ใช้ สามารถใช้ได้แม้ว่าจะไม่ได้ติดตั้ง RSAT ตรวจสอบบทความ “การใช้โมดูล AD โดยไม่ต้องติดตั้ง RSAT”
เปิดใช้งานการเริ่มต้นอัตโนมัติสำหรับสคริปต์ PS หรือเรียกใช้เป็นสคริปต์การเข้าสู่ระบบ GPO
การแจ้งเตือนอีเมลหมดอายุของรหัสผ่านผ่าน Powershell
หากคุณต้องการแจ้งผู้ใช้เกี่ยวกับการหมดอายุของรหัสผ่านทางอีเมล คุณสามารถใช้สคริปต์ PowerShell นี้:
$Sender = "[email protected]"
$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 อีเมลจะถูกส่งไปจนกว่ารหัสผ่านจะถูกเปลี่ยนหรือหมดอายุ
ผู้ดูแลระบบสามารถบังคับเปลี่ยนรหัสผ่านของผู้ใช้ได้โดยใช้ Set-ADAccountPassword cmdletเรียกใช้สคริปต์ PowerShell นี้เป็นประจำบนคอมพิวเตอร์/เซิร์ฟเวอร์ใดๆ ในโดเมนของคุณ (ทำได้ง่ายกว่าด้วย Task Scheduler) แน่นอน คุณจะต้องเพิ่มที่อยู่ IP ของโฮสต์ที่ส่งอีเมลไปยังรายชื่อผู้ส่งที่อนุญาต (สามารถส่งอีเมลโดยไม่ต้องตรวจสอบสิทธิ์) บนเซิร์ฟเวอร์ SMTP ของคุณ