Напоминание об истечении срока пароля в домене AD

Несмотря на то, что Microsoft убрала требование регулярной смены пароли пользователей из своих рекомендаций безопасности, в большинстве on-prem доменов Active Directory включена политика, ограничивающая срок действия паролей пользователей. Часто пользователи забывают вовремя сменить свой пароль, срок действия которого истек, что вызывает лишние обращения в службы ИТ поддержки.

В этой статье мы рассмотрим, как узнать, когда истекает пароль учетной записи пользователя в домене и как заблаговременно напомнить пользователю о том, что ему нужно сменить свой пароль.

Как узнать срок действия пароля пользователя в Active Directory?

Срок действия пароля пользователя в домене определяется настройками парольной политики AD. Текущие настройки политики срока действия паролей в домене можно получить с помощью команды PowerShell:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

В нашем примере максимальный срок действия пароля пользователя в домене – 60 дней.

Get-ADDefaultDomainPasswordPolicy срок действия пароля в домене MaxPasswordAge

Также опционально для некоторых пользователей/групп могут быть включены гранулированные политики паролей (Fine-Grained Password Policy) с другими настройками срока действия пароля.

В свойствах пользователя в Active Directory содержится только атрибут pwdLastSet, который содержит дату последней смены пароля ( можно посмотреть в консоли ADUC -> вкладка редактор атрибутов AD).

pwdLastSet в свойтсвах пользователя

Узнать дату окончания срока действия пароля пользователя в домене можно с помощью PowerShell (требуется модуль AD PowerShell), который позволяет получить значение атрибута msDS-UserPasswordExpiryTimeComputed. Этот constructed-атрибут автоматически вычисляется на основании времени последней смены пароля и парольной политики:

Get-ADUser -Identity a.ivanov -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, PasswordNeverExpires, PasswordExpired |Select-Object -Property Name,PasswordLastSet, PasswordNeverExpires, PasswordExpired,@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}

msDS-UserPasswordExpiryTimeComputed атрибут ad

Командлет возвращает такие значения таких атрибутов:

  • PasswordLastSet — время последней смены пароля;
  • PasswordNeverExpires – возвращает True, если пароль пользователя никогда не устаревает (бессрочный пароль). Это один из битовых значений атрибута UserAccountControl);
  • PasswordExpired – возвращает True, если пароль пользователя устарел;
  • ExpiryDate – дата, когда истечет срок действия пароля

Вывести всех пользователей из определенного контейнера (OU) AD, срок действия пароля которых уже истек:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=SPB,DC=corp,DC=winitpro,DC=ru' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet
$Users | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet | where ExpirationDate -lt (Get-Date)

Список пользователей AD с истекшими паролями

Если значение msDS-UserPasswordExpiryTimeComputed равно 0, значит pwdLastSet пустой (null) или равен 0 (пароль пользователя никогда не менялся).

Политика оповещения об окончании срока действия пароля

В Windows можно включить параметр групповой политики, позволяющий оповещать пользователей о необходимости сменить пароль.

Политика называется Interactive logon: Prompt user to change password before expiration и находится в разделе GPO Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options

политика уведомления о неоходимости смены пароля Interactive logon: Prompt user to change password before expiration

По умолчанию эту политика включена на уровне локальной групповой политики Windows и уведомления начинают появляться за 5 дней до истечения срока действия пароля. Вы можете изменить количество дней, в течении которых должно появляться уведомление о смене пароля.

После включения этой политики, если пароль пользователя истекает, то при входе в трее Windows будет появляться уведомление о необходимости сменить пароль.

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

всплывающее уведомление Windows - надо сменить пароль

Это сообщение появляется на несколько секунд и часто игнорируется пользователями. Поэтому вы можете добавить дополнительное всплывающее уведомление о необходимости смены пароля.

Вывести уведомление об истечении срока пароля с помощью PowerShell

Следующий PowerShell скрипт будет выводить всплывающее уведомление с предложением сменить пароль, если он истекает менее чем через 5 дней:

$DaysLeft = 5
try{
Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,system.windows.forms
} catch {
Throw "Failed to load Windows Presentation Framework assemblies."
}
$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 $DaysLeft) {
$msgBoxInput = [System.Windows.MessageBox]::Show("Ваш пароль истекает через "+ $timediff + " дней!`nХотите сменить пароль сейчас?","Внимание!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
$Console = quser | Select-String -Pattern ">"| Select-String -Pattern "console" -Quiet
if ( $Console ) {
Start-Process -FilePath powershell -ArgumentList "-command Set-ADAccountPassword -Identity $env:username ; pause"
} else { cmd /c "C:\Windows\explorer.exe shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}" } } 'No' { } } } }
Скрипт предполагает, что на компьютерах пользователей установлен модуль AD для PowerShell. Его можно использовать даже без установки RSAT . См. статью Использование модуля Active Directory PowerShell без установки RSAT.

powershell скрипт предложить пользователю сменить пароль, если он истекает

Если до истечения срока действия пароля пользователя осталось менее 5 дней, скрипт предложит пользователю сменить пароль. Если пользователь нажимает Да, выполняется проверка залогинен ли пользователь на консоль компьютера:

Данный PowerShell скрипт можно запускать по расписанию через планировщик задач, поместить автозагрузку или запускать как logon скрипт групповых политик.

Однако это будет работать только на компьютерах, добавленных в домен Active Directory. Если пользователь подключается к домену через VPN (и вы не можете настроили запуск VPN до входа в Windows) или веб клиенты (типа OWA), он не увидит уведомления о приближении даты окончания срока действия пароля. В этом случае можно оповещать пользователей об истечении пароля по почте.

PowerShell: отправка почтовых уведомлений об истечении пароля на e-mail

С помощью PowerShell вы можете настроить отправку уведомлений на email пользователям о том, что срок действия их пароля истекает.

$Sender = "[email protected]"
$Subject = 'Внимание! Скоро истекает срок действия Вашего пароля!'
$BodyTxt1 = 'Срок действия Вашего пароля для'
$BodyTxt2 = 'заканчивается через '
$BodyTxt3 = 'дней. Не забудьте заранее сменить Ваш пароль. Если у вас есть вопросы, обратитесь в службу HelpDesk.'
$smtpserver ="smtp.domain.com"
$warnDays = (get-date).adddays(7)
$2Day = get-date
$Users = Get-ADUser -SearchBase 'OU=Users,DC=corp,DC=winitpro,DC=ru' -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
}
}

У командлета Send-MailMessage есть параметр -Attachment. Он позволяет прикреплять к письму файл с инструкцией о том, как пользователь может выполнить смену пароля в вашей сети.

Скрипт проверяет всех активных пользователей домена с истекающими паролями. За 7 дней до истечения пароля пользователю начинают отправляться письма на email адрес, указанный в AD (атрибут должен быть заполнен). Письма отправляются до тех пор, пока пароль не будет изменен или просрочен.

Данный PowerShell скрипт нужно запускать регулярно на любом компьютере/сервере домена (проще всего через Task Scheduler). Естественно, нужно на вашем SMTP сервере добавить IP адрес хоста, с которого рассылаются письма, в разрешенные отправители без аутентификации.

Немного модифицировав скрипт, вы можете отправлять сообщения об истечении срока действия пароля пользователям в мессенджеры:


Предыдущая статья Следующая статья


Комментариев: 66 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)