Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

ในบทความนี้เราจะแสดงวิธีค้นหาว่ารหัสผ่านของบัญชีผู้ใช้ Active Directory จะหมดอายุเมื่อไหร่โดยใช้ PowerShell วิธีตั้งค่ารหัสผ่านให้ไม่มีวันหมดอายุ (PasswordNeverExpires = True) และการแจ้งเตือนผู้ใช้ล่วงหน้าให้เปลี่ยนรหัสผ่าน

หากรหัสผ่านของผู้ใช้ในโดเมนหมดอายุ บัญชีนั้นจะไม่ถูกล็อก แต่ไม่สามารถใช้เพื่อเข้าถึงทรัพยากรโดเมนได้จนกว่าผู้ใช้จะเปลี่ยนรหัสผ่านที่หมดอายุเป็นรหัสใหม่ บ่อยครั้งที่ผู้ใช้ระยะไกลเผชิญปัญหากับรหัสผ่านที่หมดอายุ เนื่องจากพวกเขาไม่สามารถเปลี่ยนรหัสผ่านได้โดยใช้เครื่องมือมาตรฐาน

เวลาหมดอายุของรหัสผ่านผู้ใช้ในโดเมน ความถี่ในการเปลี่ยน (Maximum Password Age) และข้อกำหนดด้านความซับซ้อน ถูกตั้งค่าในนโยบายรหัสผ่านโดเมนของ AD พารามิเตอร์เหล่านี้ถูกตั้งค่าใน Default Domain Policy หรือ Fine-Grained Password Policy

คุณสามารถรับการตั้งค่านโยบายรหัสผ่านโดเมนปัจจุบันได้โดยใช้คำสั่ง PowerShell นี้:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

ในตัวอย่างของเรา อายุสูงสุดของรหัสผ่านผู้ใช้ในโดเมนคือ 60 วัน

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

วิธีรับวันที่หมดอายุรหัสผ่านของผู้ใช้ใน Active Directory

คุณสามารถดูอายุรหัสผ่านและวันที่เปลี่ยนล่าสุดใน Command Prompt โดยใช้คำสั่ง Net user:

net user jsmith /domain

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

คุณสามารถค้นหาข้อมูลที่คุณต้องการในบรรทัดเหล่านี้:

  • 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

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

  • PasswordLastSet คือวันที่และเวลาของการเปลี่ยนรหัสผ่านล่าสุด;
  • PasswordNeverExpires คืนค่า True หากรหัสผ่านผู้ใช้ไม่มีวันหมดอายุ;
  • PasswordExpired – หากรหัสผ่านผู้ใช้หมดอายุ คืนค่า True หากรหัสผ่านไม่หมดอายุ คืนค่า False

คุณสามารถตรวจสอบเวลาการเปลี่ยนรหัสผ่านล่าสุดในสแนปอิน MMC แบบกราฟิก Active Directory Users & Computers (dsa.msc) เพื่อทำเช่นนั้น ให้เปิดคุณสมบัติผู้ใช้ ไปที่แท็บ Attribute Editor และตรวจสอบค่าของแอตทริบิวต์ pwdLastSet

แต่ดังที่คุณเห็น สแนปอิน MMC แสดงเฉพาะเวลาที่เปลี่ยนรหัสผ่าน ไม่ชัดเจนว่ารหัสผ่านจะหมดอายุเมื่อไหร่

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

เพื่อรับวันที่หมดอายุรหัสผ่านแทนเวลาที่เปลี่ยนล่าสุด ให้ใช้แอตทริบิวต์ AD ที่สร้างขึ้นอย่างพิเศษ: msDS-UserPasswordExpiryTimeComputed ค่า msDS-UserPasswordExpiryTimeComputed คำนวณโดยอัตโนมัติจากวันที่เปลี่ยนรหัสผ่านล่าสุดและนโยบายรหัสผ่านโดเมน

พารามิเตอร์ UserPasswordExpiryTimeComputed คืนค่าวันในรูปแบบ TimeStamp ดังนั้นผมใช้ฟังก์ชัน FromFileTime เพื่อแปลงเป็นค่าที่มนุษย์อ่านได้:

Get-ADUser -Identity jsmith -Properties msDS-UserPasswordExpiryTimeComputed | select-object @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") }}

ดังนั้นเราได้วันที่หมดอายุรหัสผ่านของผู้ใช้

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

หากค่าของ 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

ผลลัพธ์เป็นตารางพร้อมรายการผู้ใช้งานอยู่ วันที่หมดอายุ และเวลาการเปลี่ยนรหัสผ่านล่าสุด

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

คุณสามารถแสดงเฉพาะรายการผู้ใช้ที่มีรหัสผ่านหมดอายุแล้ว:

$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)

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

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

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

หลังจากเปิดใช้งานโพลิซีนี้ หากรหัสผ่านของผู้ใช้ใกล้หมดอายุ การแจ้งเตือนให้เปลี่ยนรหัสผ่านจะปรากฏใน System Tray ทุกครั้งที่ผู้ใช้เข้าสู่ระบบ

Consider changing your password Your password will expire in xx days.

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

คุณยังสามารถใช้สคริปต์ 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)

การแจ้งเตือนเปลี่ยนรหัสผ่านเมื่อรหัสผ่าน AD User ใกล้หมดอายุ

สคริปต์นี้หมายความว่าโมดูล 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 ของคุณ