Уведомление о смене пароля, когда срок действия пароля пользователя AD истекает
В этой статье мы покажем, как узнать, когда истекает срок действия пароля учетной записи пользователя Active Directory с помощью PowerShell, как установить бессрочный пароль (
PasswordNeverExpires = True) и заранее уведомить пользователей о необходимости смены пароля.
Если срок действия пароля пользователя в домене истек, учетная запись не блокируется, но ее нельзя использовать для доступа к ресурсам домена, пока пользователь не сменит пароль с истекшим сроком действия на новый. Чаще всего с проблемами с истекшими паролями сталкиваются удаленные пользователи, так как они не могут изменить свои пароли стандартными средствами.
Ограничение срока действия пароля пользователя в домене, частота его смены (максимальный срок действия пароля) и требования к сложности устанавливаются в политике паролей домена AD. Эти параметры задаются в политике домена по умолчанию или в политике детальных паролей.
Вы можете получить текущие настройки политики срока действия пароля в домене с помощью этой команды PowerShell:
Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge
В нашем примере максимальный срок действия пароля пользователя в домене составляет 60 дней.
Как узнать дату истечения срока действия пароля пользователя в Active Directory?
Вы можете просмотреть срок действия пароля и дату его последнего изменения в командной строке с помощью команды Net user:
net user jsmith /domainВ этих строках вы можете найти необходимую вам информацию:
Последний установленный пароль — 09.09.2020 9:23:59
Срок действия пароля истек — 07.01.2021, 9:23:59
Пароль сменный — 10.09.2020 9:23:59
Вы можете узнать дату истечения срока действия пароля для любого пользователя. Для этого вам не нужны права администратора или делегированные привилегии в контейнере AD с учетными записями пользователей.
Для просмотра настроек учетных записей AD мы будем использовать специальный модуль PowerShell для Active Directory, который позволяет получать значения различных атрибутов объекта AD (см., как установить и импортировать модуль AD PowerShell в Windows 10 и Windows Server 2012 R2/2016). ).
С помощью командлета Get-ADUser вы можете просмотреть дату последнего изменения пароля пользователя и проверить, установлен ли параметр PasswordNeverExpires:
get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired |ft Name, PasswordLastSet, PasswordNeverExpires,PasswordExpiredPasswordLastSet — дата и время последней смены пароля;
PasswordNeverExpires возвращает True, если срок действия пароля пользователя никогда не истекает;
PasswordExpired - если срок действия пароля пользователя истек, возвращается True, если срок действия пароля не истек, возвращается False.
Проверить время последней смены пароля можно в графической оснастке MMC «Пользователи и компьютеры Active Directory» (
dsa.msc). Для этого откройте свойства пользователя, перейдите на вкладку «Редактор атрибутов» и проверьте значение атрибута pwdLastSet.
Но как видите, оснастка ММС показывает только время смены пароля. Непонятно, когда истечет срок действия пароля.
Чтобы получить дату истечения срока действия пароля, а не время его последнего изменения, используйте специальный сконструированный атрибут AD: msDS-UserPasswordExpiryTimeComputed. Значение msDS-UserPasswordExpiryTimeComputed рассчитывается автоматически на основе даты последней смены пароля и политики паролей домена.
Параметр UserPasswordExpiryTimeComputed возвращает дату в формате TimeStamp, поэтому я использую
FromFileTimeфункция для преобразования ее в удобочитаемое значение:
Get-ADUser -Identity jsmith -Properties msDS-UserPasswordExpiryTimeComputed | select-object @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") }}Таким образом, мы получили срок действия пароля пользователя.
Если значение msDS-UserPasswordExpiryTimeComputed равно 0, это означает, что pwdLastSet пуст (нулевой) или равен 0 (пароль никогда не менялся).
Чтобы получить даты истечения срока действия паролей для всех пользователей из определенного контейнера (OU) в AD, вы можете использовать следующий сценарий PowerShell:
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=active-directory,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В результате получается таблица со списком активных пользователей, сроком действия и временем последней смены пароля.
Вы можете отобразить только список пользователей с истекшими паролями:
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=active-directory,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
}
}Как сделать так, чтобы пароль пользователя AD никогда не истекал?
Если вы хотите установить постоянный пароль для учетной записи, установите флажок Пароль никогда не истекает в свойствах пользователя в AD (это одно из битовых значений атрибута UserAccoutControl).
Или вы можете включить эту опцию с помощью PowerShell, установив атрибут пользователя:
Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$TrueВы можете установить параметр «Срок действия пароля никогда не истекает» одновременно для нескольких пользователей из списка в текстовом файле:
$users=Get-Content "C:\PS\users_password_never_expire.txt"
Foreach ($user in $users) {
Set-ADUser $user -PasswordNeverExpires:$True
}Вы можете отобразить список всех пользователей с отключенной возможностью регулярной смены пароля:
Get-ADUser -filter * -properties Name, PasswordNeverExpires | where {$_.passwordNeverExpires -eq "true" } | Select-Object DistinguishedName,Name,Enabled |ftПолитика уведомления об истечении срока действия пароля Active Directory
В Windows есть специальный параметр групповой политики, который позволяет уведомлять пользователей о необходимости сменить пароли.
Политика называется Интерактивный вход в систему: предлагать пользователю сменить пароль до истечения срока действия и находится в разделе GPO: Конфигурация компьютера -> Политики -> Настройки Windows -> Настройки безопасности -> Локальные политики -> Параметры безопасности. .
По умолчанию политика включена в локальных настройках Windows, а уведомления начинают появляться за 5 дней до истечения срока действия пароля. Вы можете изменить количество дней, в течение которых пользователи будут видеть уведомление о смене пароля.
После включения этой политики, если срок действия пароля пользователя истечет, уведомление о смене пароля будет появляться на панели задач каждый раз, когда пользователь входит в систему.
Consider changing your password
Your password will expire in xx days.Вы также можете использовать простой скрипт PowerShell, который автоматически отображает диалоговое окно с предложением сменить пароль, если срок его действия истекает менее чем через 5 дней:
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' { }
}
}
}Если пользователь нажимает «ДА», появляется окно «Безопасность Windows», которое вы видите после нажатия
Ctrl+Alt+Delили
Ctrl+Alt+End(в случае подключения RDP/RDS).
Скрипт подразумевает, что на компьютерах пользователей установлен модуль PowerShell for AD. Его можно использовать, даже если RSAT не установлен. Прочтите статью «Использование модуля AD без установки RSAT».
Включите автоматический запуск сценария PS или запустите его как сценарий входа в объект групповой политики.
Уведомление по электронной почте об истечении срока действия пароля через Powershell
Если вы хотите уведомить пользователей об истечении срока действия их пароля по электронной почте, вы можете использовать этот сценарий PowerShell:
$Sender = "info@active-directory.ru"
$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.active-directory.ru"
$warnDays = (get-date).adddays(7)
$2Day = get-date
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=active-directory,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
}
}Скрипт проверяет всех активных пользователей домена, срок действия паролей которых скоро истечет. За 7 дней до истечения срока действия пароля пользователь начинает получать электронные письма, отправленные на адрес, указанный в AD. Электронные письма отправляются до тех пор, пока пароль не будет изменен или не истечет срок его действия.
Администратор может принудительно изменить пароль пользователя с помощью командлета Set-ADAccountPassword.
Регулярно запускайте этот сценарий PowerShell на любом компьютере/сервере вашего домена (это проще сделать с помощью планировщика задач). Конечно, вам придется добавить IP-адрес хоста, который отправляет электронные письма, в список разрешенных отправителей (может отправлять электронную почту без аутентификации) на вашем SMTP-сервере.









