Несмотря на то, что Microsoft убрала требование регулярной смены пароли пользователей из своих рекомендаций безопасности, в большинстве on-prem доменов Active Directory включена политика, ограничивающая срок действия паролей пользователей. Часто пользователи забывают вовремя сменить свой пароль, срок действия которого истек, что вызывает лишние обращения в службы ИТ поддержки.
В этой статье мы рассмотрим, как узнать, когда истекает пароль учетной записи пользователя в домене и как заблаговременно напомнить пользователю о том, что ему нужно сменить свой пароль.
Как узнать срок действия пароля пользователя в Active Directory?
Срок действия пароля пользователя в домене определяется настройками парольной политики AD. Текущие настройки политики срока действия паролей в домене можно получить с помощью команды PowerShell:
Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge
В нашем примере максимальный срок действия пароля пользователя в домене – 60 дней.
В свойствах пользователя в Active Directory содержится только атрибут pwdLastSet, который содержит дату последней смены пароля ( можно посмотреть в консоли ADUC -> вкладка редактор атрибутов AD).
Узнать дату окончания срока действия пароля пользователя в домене можно с помощью 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")}}
Командлет возвращает такие значения таких атрибутов:
- 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)
Политика оповещения об окончании срока действия пароля
В Windows можно включить параметр групповой политики, позволяющий оповещать пользователей о необходимости сменить пароль.
Политика называется Interactive logon: Prompt user to change password before expiration и находится в разделе GPO Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options
По умолчанию эту политика включена на уровне локальной групповой политики Windows и уведомления начинают появляться за 5 дней до истечения срока действия пароля. Вы можете изменить количество дней, в течении которых должно появляться уведомление о смене пароля.
После включения этой политики, если пароль пользователя истекает, то при входе в трее Windows будет появляться уведомление о необходимости сменить пароль.
Consider changing your password Your password will expire in xx days.
Это сообщение появляется на несколько секунд и часто игнорируется пользователями. Поэтому вы можете добавить дополнительное всплывающее уведомление о необходимости смены пароля.
Вывести уведомление об истечении срока пароля с помощью 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' { } } } }
Если до истечения срока действия пароля пользователя осталось менее 5 дней, скрипт предложит пользователю сменить пароль. Если пользователь нажимает Да, выполняется проверка залогинен ли пользователь на консоль компьютера:
- В случае определения RDP сессий, пользователю отображается окно Windows Security, которое вы видите при нажатии Ctrl+Alt+Del или
Ctrl+Alt+End
(при RDP подключении). - Если сессия консольная, выводится окно командлета Set-ADAccountPassword, в котором можно сменить пароль.
Данный 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
}
}
Скрипт проверяет всех активных пользователей домена с истекающими паролями. За 7 дней до истечения пароля пользователю начинают отправляться письма на email адрес, указанный в AD (атрибут должен быть заполнен). Письма отправляются до тех пор, пока пароль не будет изменен или просрочен.
Данный PowerShell скрипт нужно запускать регулярно на любом компьютере/сервере домена (проще всего через Task Scheduler). Естественно, нужно на вашем SMTP сервере добавить IP адрес хоста, с которого рассылаются письма, в разрешенные отправители без аутентификации.