Computer >> Máy Tính >  >> Hệ thống >> máy chủ Windows

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

Trong bài viết này, chúng tôi sẽ hướng dẫn cách tìm hiểu khi nào mật khẩu của 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 trước cho người dùng để thay đổi mật khẩu của họ.

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

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

Bạn có thể nhận 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 sau:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

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

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

Làm cách nào để 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 thay đổi lần cuối trong dấu nhắc lệnh bằng cách sử dụng Người dùng mạng lệnh:

net user jsmith /domain

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

Bạn có thể tìm thấy thông tin bạn cần trong những dòng sau:

  • Mật khẩu đặt lần cuối - 9/9/2020 9:23:59 sáng
  • Mật khẩu hết hạn - 1/7/2021 9:23:59 sáng
  • Mật khẩu có thể thay đổi - 9/10/2020 9:23:59 sáng
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 của quản trị viên hoặc đặc quyền được ủy quyền trên vùng chứa AD với tài khoản người dùng.

Để xem cài đặt của tài khoản AD, chúng tôi sẽ sử dụng mô-đun PowerShell dành cho Active Directory đặc biệt cho phép bạn nhận các giá trị của các thuộc tính đối tượng AD khác nhau (xem cách cài đặt và nhập mô-đun AD PowerShell trong Windows 10 và Windows Server 2012 R2 / 2016 ).

Sử dụng lệnh ghép ngắn Get-ADUser, bạn có thể xem ngày thay đổi mật khẩu của người dùng lần trước và kiểm tra xem tùy chọn PasswordNeverExpires đã được đặt chưa:

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

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

  • PasswordLastSet là ngày và giờ của lần thay đổi mật khẩu cuối cùng;
  • PasswordNeverExpires trả về Đúng nếu mật khẩu người dùng không bao giờ hết hạn;
  • Mật khẩu đã hết hạn - nếu mật khẩu người dùng đã hết hạn, nó trả về True , nếu mật khẩu chưa hết hạn, nó sẽ trả về False .
Bạn có thể kiểm tra thời gian thay đổi mật khẩu cuối cùng trong MMC snap-in Active Directory Users &Computers (dsa.msc ). Để làm điều đó, hãy mở thuộc tính người dùng, chuyển đến tab Trình chỉnh sửa thuộc tính và kiểm tra giá trị của pwdLastSet thuộc tính.

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

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

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

UserPasswordExpiryTimeComputed tham số trả về ngày ở định dạng TimeStamp, vì vậy tôi sử dụng FromFileTime hàm để chuyển đổi nó thành giá trị có thể đọc được của con người:

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

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

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

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

Để nhận ngày hết hạn mật khẩu cho tất cả người dùng từ vùng chứa cụ thể (OU) trong AD, bạn có thể sử dụng tập lệnh 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

Nó dẫn đến một bảng với danh sách những người dùng đang hoạt động, ngày hết hạn và thời gian của lần thay đổi mật khẩu cuối cùng.

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

Bạn chỉ có thể hiển thị danh sách những 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
}
}

Làm cách nào để Đặt Mật khẩu Người dùng AD thành 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 mục Mật khẩu không bao giờ hết hạn trong thuộc tính người dùng trong AD (nó là một trong những giá trị bit của thuộc tính UserAccoutControl).

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

Hoặc bạn có thể bật tùy chọn này với 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 một lúc cho nhiều người dùng từ danh sách trong tệp 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 thay đổi mật khẩu thông thường bị vô hiệu hóa:

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ó một tham số Chính sách Nhóm đặc biệt cho phép thông báo cho người dùng rằng họ phải thay đổi mật khẩu của mình.

Chính sách này được gọi là Đăng nhập tương tác:Nhắc người dùng thay đổi mật khẩu trước khi hết hạn và nằm trong phần GPO:Cấu hình máy tính -> Chính sách -> Cài đặt Windows -> Cài đặt bảo mật -> Chính sách cục bộ -> Tùy chọn bảo mật.

Theo mặc định, chính sách này được bật trên cài đặt Windows cục bộ và các 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 mà người dùng sẽ thấy thông báo thay đổi mật khẩu.

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

Sau khi bật chính sách này, nếu mật khẩu của người dùng hết hạn, thông báo thay đổi mật khẩu sẽ xuất hiện trong khay 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 thay đổi mật khẩu khi mật khẩu người dùng AD sắp hết hạn

Bạn cũng có thể sử dụng tập lệnh PowerShell đơn giản tự động hiển thị cửa sổ hộp thoại với lời nhắc thay đổi mật khẩu nếu mật khẩu hết hạn sau 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 vào CÓ, cửa sổ Bảo mật Windows 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 thay đổi mật khẩu khi mật khẩu người dùng AD sắp hết hạn

Tập lệnh ngụ ý rằng mô-đun PowerShell cho AD được cài đặt trên máy tính của người dùng. Nó có thể được sử dụng ngay cả khi RSAT không được cài đặt. Kiểm tra bài viết “Sử dụng mô-đun AD mà không cần cài đặt RSAT”.

Bật khởi động tự động cho tập lệnh PS hoặc chạy tập lệnh đó dưới dạng tập lệnh đăng nhập GPO.

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

Nếu bạn muốn thông báo cho người dùng về việc hết hạn mật khẩu của họ qua email, bạn có thể sử dụng tập lệnh 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
}
}

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

Quản trị viên có thể buộc thay đổi mật khẩu người dùng bằng lệnh ghép ngắn Set-ADAccountPassword.

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