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

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

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

Параметры политики паролей домена AD определяют дату истечения срока действия пароля пользователя в домене. Чтобы узнать текущие настройки политики истечения срока действия пароля в домене, выполните команду PowerShell:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

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

powershell: Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

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

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

pwdlastset значение в свойствах пользователя ADUC

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

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

msDS-UserPasswordExpiryTimeComputed показывает, когда истекает срок действия пароля пользователя рекламы

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

  • PasswordLastSet — время последней смены пароля;
  • PasswordNeverExpires — возвраты Правда если для пароля пользователя установлено значение Never Expire. Это одно из битовых значений атрибута UserAccountControl;
  • PasswordExpired — возвращается Правда если срок действия пароля пользователя истек;
  • ExpiryDate — дата истечения срока действия пароля.

Список всех пользователей из определенного контейнера AD (Organisational Unit), срок действия паролей которых истек:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -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)

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

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

Включение политики уведомления об истечении срока действия пароля Active Directory

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

[Интерактивный вход в систему: Предложите пользователю сменить пароль до истечения срока действия политика находится в разделе GPO: Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options.

Параметр групповой политики: Интерактивный вход в систему: Предлагать пользователю сменить пароль до истечения срока действия

Эта политика включена по умолчанию в настройках локальной групповой политики (gpedit.msc). Уведомления начнут появляться за 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("Your password will expire in "+ $timediff + " days!`nDoyou want to change it now?","Important!","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 не установлен. См: Использование модуля AD без установки RSAT.

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

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

  • Если обнаружены сеансы RDP, пользователь увидит запрос на изменение пароля Windows Security, который можно вызвать, нажав кнопку Ctrl+Alt+Del или Ctrl+Alt+End (используется для изменения пароля в сеансе RDP). изменение пароля пользователя с экрана безопасности windows
  • Если пользователь вошел в систему локально (консольная сессия), команда Set-ADAccountPassword предложит вам изменить пароль. Set-ADAccountPassword - запрос на изменение пароля текущего пользователя

Запланируйте этот сценарий PowerShell для запуска через планировщик задач или запустите его как сценарий входа в GPO.

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

Отправка уведомлений об истечении срока действия учетной записи по электронной почте с помощью PowerShell

Если вы хотите уведомить пользователей, отправив им электронное письмо, когда срок действия их пароля истекает, вы можете использовать этот сценарий PowerShell:

$Sender = "[email protected]"
$Subject="Important! Your password is about to expire!"
$BodyTxt1 = 'Your password for'
$BodyTxt2 = 'expires in '
$BodyTxt3 = 'days. Remember to change your password in advance. Contact the HelpDesk if you have any questions'
$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
}
}

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

Сценарий находит всех активных пользователей домена, срок действия паролей которых истекает. За 7 дней до истечения срока действия пароля пользователь начнет получать электронные письма, отправленные на адрес, указанный в AD. Письма будут отправляться до тех пор, пока пароль не будет изменен или не истечет срок его действия.

Регулярно запускайте этот сценарий PowerShell на любом компьютере/сервере в вашем домене (проще всего это делать с помощью планировщика задач). В этом примере мы не используем SMTP-аутентификацию в сценарии. Поэтому следует добавить IP-адрес этого хоста в список разрешенных отправителей на вашем SMTP-сервере, чтобы разрешить отправку почты без аутентификации.

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

  • Отправка сообщений Telegram из PowerShell
  • Отправка сообщения в чаты Teams с помощью PowerShell