Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

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

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

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

การจำกัดเวลาหมดอายุของรหัสผ่านผู้ใช้ในโดเมน ความถี่ที่ต้องเปลี่ยน (อายุรหัสผ่านสูงสุด) และข้อกำหนดความซับซ้อนถูกกำหนดไว้ในนโยบายรหัสผ่านโดเมน AD พารามิเตอร์เหล่านี้ได้รับการตั้งค่าในนโยบายโดเมนเริ่มต้นหรือนโยบายรหัสผ่านแบบละเอียด

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

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

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

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

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

คุณสามารถดูอายุรหัสผ่านและวันที่เมื่อมีการเปลี่ยนแปลงครั้งล่าสุดในพรอมต์คำสั่งโดยใช้ ผู้ใช้เน็ต คำสั่ง:

net user jsmith /domain

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

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

  • รหัสผ่านชุดสุดท้าย — 9/9/2020 09:23:59 น.
  • รหัสผ่านหมดอายุ — 1/7/2021 09:23:59 น.
  • เปลี่ยนรหัสผ่านได้ — 9/10/2020 09:23:59 น.
คุณสามารถรับวันหมดอายุของรหัสผ่านสำหรับผู้ใช้คนใดก็ได้ ในการดำเนินการนี้ คุณไม่จำเป็นต้องมีสิทธิ์ของผู้ดูแลระบบหรือสิทธิ์ที่ได้รับมอบสิทธิ์ในคอนเทนเนอร์ AD ที่มีบัญชีผู้ใช้

ในการดูการตั้งค่าของบัญชี 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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