Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Trong bài viết này, chúng tôi sẽ chỉ cách biết khi nào mật khẩu tài khoản người dùng Active Directory hết hạn bằng PowerShell, cách đặt mật khẩu không bao giờ hết hạn (PasswordNeverExpires = True), và thông báo cho người dùng trước để đổi mật khẩu.

Nếu mật khẩu người dùng trong miền đã hết hạn, tài khoản không bị khóa, nhưng không thể dùng để truy cập tài nguyên miền cho đến khi người dùng đổi mật khẩu hết hạn thành mật khẩu mới. Thường xuyên nhất, người dùng từ xa gặp vấn đề với mật khẩu hết hạn, vì họ không thể đổi mật khẩu bằng công cụ tiêu chuẩn.

Giới hạn thời gian hết hạn mật khẩu người dùng trong miền, tần suất phải đổi (tuổi tối đa mật khẩu) và yêu cầu độ phức tạp được đặt trong chính sách mật khẩu miền AD. Các tham số này được đặt trong Default Domain Policy hoặc Fine-Grained Password Policy.

Bạn có thể lấy cài đặt chính sách hết hạn mật khẩu hiện tại trong miền bằng lệnh PowerShell này:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

Trong ví dụ của chúng tôi, tuổi tối đa mật khẩu người dùng trong miền là 60 ngày.

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Cách lấy ngày hết hạn mật khẩu người dùng trong Active Directory?

Bạn có thể xem tuổi mật khẩu và ngày nó được đổi lần cuối trong command prompt dùng lệnh Net user:

net user jsmith /domain

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Bạn có thể tìm thông tin cần thiết trong các dòng sau:

  • 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

Bạn có thể lấy ngày hết hạn mật khẩu cho bất kỳ người dùng nào. Để làm điều đó, bạn không cần đặc quyền quản trị hoặc ủy quyền trên container AD chứa tài khoản người dùng.

Để xem cài đặt tài khoản AD, chúng ta sẽ dùng module PowerShell đặc biệt cho Active Directory cho phép lấy giá trị các thuộc tính đối tượng AD (xem cách cài đặt và import module AD PowerShell trong Windows 10 và Windows Server 2012 R2/2016).

Sử dụng cmdlet Get-ADUser, bạn có thể xem ngày mật khẩu người dùng được đổi lần cuối và kiểm tra tùy chọn PasswordNeverExpires:

get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired |ft Name, PasswordLastSet, PasswordNeverExpires,PasswordExpired

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

  • PasswordLastSet là ngày và giờ đổi mật khẩu lần cuối;
  • PasswordNeverExpires trả về True nếu mật khẩu người dùng không bao giờ hết hạn;
  • PasswordExpired – nếu mật khẩu người dùng đã hết hạn, trả về True, nếu chưa hết hạn, trả về False.

Bạn có thể kiểm tra thời gian đổi mật khẩu cuối trong snap-in MMC đồ họa Active Directory Users & Computers (dsa.msc). Để làm vậy, mở thuộc tính người dùng, đi đến tab Attribute Editor và kiểm tra giá trị thuộc tính pwdLastSet.

Nhưng như bạn thấy, snap-in MMC chỉ hiển thị thời gian đổi mật khẩu. Không rõ khi nào mật khẩu hết hạn.

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Để lấy ngày hết hạn mật khẩu thay vì thời gian đổi lần cuối, dùng thuộc tính AD đặc biệt: msDS-UserPasswordExpiryTimeComputed. Giá trị msDS-UserPasswordExpiryTimeComputed được tính tự động dựa trên ngày đổi mật khẩu cuối và chính sách mật khẩu miền.

Tham số UserPasswordExpiryTimeComputed trả về ngày ở định dạng TimeStamp, nên tôi dùng hàm FromFileTime để chuyển sang giá trị dễ đọc:

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

Vậy chúng ta đã có ngày hết hạn mật khẩu người dùng.

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Nếu giá trị msDS-UserPasswordExpiryTimeComputed là 0, nghĩa là pwdLastSet rỗng (null) hoặc bằng 0 (mật khẩu chưa bao giờ được đổi).

Để lấy ngày hết hạn mật khẩu cho tất cả người dùng từ container (OU) cụ thể trong AD, bạn có thể dùng script PowerShell sau:

$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

Kết quả là bảng với danh sách người dùng hoạt động, ngày hết hạn và thời gian đổi mật khẩu lần cuối.

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Bạn có thể chỉ hiển thị danh sách người dùng có mật khẩu đã hết hạn:

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

Cách đặt mật khẩu AD User không bao giờ hết hạn?

Nếu bạn muốn đặt mật khẩu vĩnh viễn cho tài khoản, hãy chọn tùy chọn Password Never Expires trong thuộc tính người dùng trong AD (đây là một trong các giá trị bit của thuộc tính UserAccoutControl).

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Hoặc bạn có thể bật tùy chọn này bằng PowerShell bằng cách đặt thuộc tính người dùng:

Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$True

Bạn có thể đặt tùy chọn Password Never Expires cùng lúc cho nhiều người dùng từ danh sách trong file văn bản:

$users=Get-Content "C:\PS\users_password_never_expire.txt"
Foreach ($user in $users) {
Set-ADUser $user -PasswordNeverExpires:$True
}

Bạn có thể hiển thị danh sách tất cả người dùng với tùy chọn đổi mật khẩu định kỳ bị tắt:

Get-ADUser -filter * -properties Name, PasswordNeverExpires | where {$_.passwordNeverExpires -eq "true" } | Select-Object DistinguishedName,Name,Enabled |ft

Chính sách thông báo hết hạn mật khẩu Active Directory

Windows có tham số Group Policy đặc biệt cho phép thông báo cho người dùng rằng họ phải đổi mật khẩu.

Chính sách gọi là Interactive logon: Prompt user to change password before expiration và nằm trong phần GPO: Computer Configuration → Policies → Windows Settings → Security Settings → Local Policies → Security Options.

Theo mặc định, chính sách được bật trên cài đặt Windows cục bộ, và thông báo bắt đầu xuất hiện 5 ngày trước khi mật khẩu hết hạn. Bạn có thể thay đổi số ngày người dùng sẽ thấy thông báo đổi mật khẩu.

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Sau khi bật chính sách này, nếu mật khẩu người dùng sắp hết hạn, thông báo đổi mật khẩu sẽ xuất hiện trong khay hệ thống mỗi khi người dùng đăng nhập.

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

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Bạn cũng có thể dùng script PowerShell đơn giản tự động hiển thị hộp thoại nhắc đổi mật khẩu nếu nó hết hạn trong chưa đầy 5 ngày:

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' { }
}
}
}

Nếu người dùng nhấp YES, cửa sổ Windows Security xuất hiện mà bạn thấy sau khi nhấn Ctrl+Alt+Del hoặc Ctrl+Alt+End (trong trường hợp kết nối RDP/RDS).

Thông báo đổi mật khẩu khi mật khẩu AD user sắp hết hạn

Script giả định module PowerShell cho AD được cài trên máy tính người dùng. Có thể dùng ngay cả khi RSAT không cài. Xem bài "Using AD module without installing RSAT".

Bật khởi động tự động cho script PS hoặc chạy nó như GPO logon script.

Thông báo hết hạn mật khẩu qua email bằng PowerShell

Nếu bạn muốn thông báo cho người dùng về hết hạn mật khẩu qua email, bạn có thể dùng script PowerShell này:

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

Script kiểm tra tất cả người dùng miền hoạt động có mật khẩu sắp hết hạn. 7 ngày trước khi mật khẩu hết hạn, người dùng bắt đầu nhận email gửi đến địa chỉ chỉ định trong AD. Email được gửi cho đến khi mật khẩu được đổi hoặc hết hạn.

Quản trị viên có thể buộc đổi mật khẩu người dùng bằng cmdlet Set-ADAccountPassword.

Chạy script PowerShell này định kỳ trên bất kỳ máy tính/server nào trong miền của bạn (dễ hơn làm với Task Scheduler). Tất nhiên, bạn phải thêm địa chỉ IP của host gửi email vào danh sách người gửi được phép (có thể gửi email không cần xác thực) trên SMTP server của bạn.