У цій статті ми покажемо, як за допомогою PowerShell дізнатися, коли закінчується пароль облікового запису користувача в Active Directory, встановити безстроковий пароль для облікового запису (PasswordNeverExpires = True) та завчасно сповістити користувачів про необхідність змінити пароль.

Якщо термін дії пароля користувача в домені закінчився, обліковий запис не блокується, але не може використовуватися для доступу до доменних ресурсів до тих пір, поки користувач не змінить свій минулий пароль на новий. Найчастіше проблеми з простроченим паролями виникає у віддалених користувачів, які не можуть змінити свій пароль стандартними засобами.

Термін дії пароля користувача в домені, частота його зміни і вимоги до складності та ін. Визначаються настройками політикою паролів в AD. Це можуть бути настройки Default Domain Policy або гранульованими політиками паролів (Fine-Grained Password Policy).

Поточні параметри політики терміну дії паролів в домені можна отримати за допомогою команди PowerShell

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

У нашому прикладі максимальний термін дії пароля користувача в домені – 60 днів.

Get-ADDefaultDomainPasswordPolicy термін дії пароля в домені MaxPasswordAge

Як дізнатися термін дії пароля користувача в Active Directory?

Можна дізнатися термін дії пароля і дату його останньої зміни з командного рядка з допомогу команди Користувач мережі:

net user aaivanov /domain

net user отримати термін дії пароля

Необхідні дані присутні в значеннях:

  • Останній встановлений пароль – 21.01.2020 11:18:37
  • Термін дії пароля закінчується – 21.03.20 11:18:37
  • Пароль можна змінити – 22.01.2020 11:18:37
Ви можете отримати термін дії пароль для будь-якого користувача, не обов’язково володіти правами адміністратора або делегованими повноваженнями на контейнер з користувачами.

Для отримання параметрів облікових записів в AD ми будемо використовувати спеціальний модуль PowerShell для Active Directory, який дозволяє отримати значення різних атрибутів об’єктів AD (див. Як встановити та імпортувати модуль AD PowerShell в Windows 10 і Windows Server 2012 R2 / 2016).

За допомогою командлета Get-AdUser можна отримати час останньої зміни пароля користувача і перевірити, чи встановлена ​​опція безстрокового пароля (PasswordNeverExpires):

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

Get-aduser PasswordLastSet - час останньої зміни пароля

  • PasswordLastSet – час останньої зміни пароля користувача;
  • PasswordNeverExpires – повертає значення True, якщо пароль користувача ніколи не старіє;
  • Пароль закінчився – якщо пароль користувача застарів – повертає True, якщо Ви не застарів – False;
Можна перевірити час останньої зміни пароля з графічної оснащення Active Directory Users & Computers (dsa.msc). Для цього відкрийте властивості користувача, перейдіть на вкладку Редактор атрибутів, перевірте значення атрибута pwdLastSet.

Але як ви бачите, в оснащенні вказана тільки час зміни пароля. Коли закінчується термін дії пароля – незрозуміло.

pwdLastSet в свойтсва користувача

Щоб одержати не час останньої зміни пароля, а дату закінчення його терміну дії, потрібно використовувати спеціальний constructed-атрибут msDS-UserPasswordExpiryTimeComputed. Значення атрибута msDS-UserPasswordExpiryTimeComputed автоматично обчислюється на підставі часу останньої зміни пароля і пральний політики домену

параметр UserPasswordExpiryTimeComputed повертає час в форматі TimeStamp і для перетворення його в людино-зрозумілий вид я використовую функцію FromFileTime:

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

Таким чином ми отримали час закінчення терміну дії пароля користувача.

атрибут UserPasswordExpiryTimeComputed - час закінчення пароля користувача

Якщо значення msDS-UserPasswordExpiryTimeComputed дорівнює 0, значить pwdLastSet порожній (null) або дорівнює 0 (пароль користувача ніколи не змінювався).

Щоб отримати термін дії паролів для всіх користувачів їх певного контейнера (OU) AD, можна скористатися таким скриптом PowerShell:

$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, CannotChangePassword
$Users | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime ($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet

В результаті з’явилася табличка зі списком активних користувачів, терміном дії і часом останньої зміни пароля.

час дії паролів користувачів в домені

Можна вивести тільки список користувачів, чий пароль вже минув:

$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, CannotChangePassword
foreach($user in $Users){
if( [datetime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed") -lt (Get-Date)) {
$user.Name
}
}

Відключити термін дії пароля для облікового запису

Якщо вам потрібно зробити термін дії пароля облікового запису користувача необмеженим, потрібно включити опцію Пароль ніколи не закінчується у властивостях користувача в AD (це одне з бітових значень атрибута UserAccountControl).

Пароль ніколи не закінчується

Або ви можете включити цю опцію через PowerShell:

Get-ADUser aaivanov |  Set-ADUser -PasswordNeverExpires:$True

Можна встановити прапор Password Never Expires відразу для декількох користувачів, список яких міститься в текстовому файлі:

$users=Get-Content "C:PSusers_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

Політика оповіщення про закінчення терміну дії пароля

У Windows є окремий параметр групової політики, що дозволяє сповіщати користувачів про необхідність змінити пароль.

політика називається Інтерактивний вхід: запропонувати користувачеві змінити пароль до закінчення терміну дії і знаходиться в розділі Конфігурація комп’ютера GPO -> Політика -> Налаштування Windows -> Налаштування безпеки -> Локальна політика -> Параметри безпеки.

За замовчуванням цю політика включена на рівні локальних налаштувань Windows і повідомлення починають з’являтися за 5 днів до закінчення терміну дії пароля. Ви можете змінити кількість днів, протягом яких має з’являтися повідомлення про зміну пароля.

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

Після включення цієї політики, якщо пароль користувача закінчується, то при вході в систему в треї буде з’являтися повідомлення про необхідність змінити пароль.

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

Подумайте про зміну пароля

Також ви можете використовувати простий PowerShel скрипт, який автоматично викликає діалогове вікно зі пропозицією змінити пароль, якщо він закінчується менш ніж через 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("Ваш пароль истекает через "+ $timediff + " дней!`nХотите сменить пароль сейчас?","Внимание!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
cmd /c "explorer shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}"
}
'No' { }
}
}
}

Якщо користувач натискає ТАК, з’являється діалогове вікно Windows Security, яке ви бачите при натисканні Ctrl + Alt + Del або Ctrl + Alt + End (при RDP підключенні).

Логон скрипт щоразу запитувати зміну пароля при завантаженні

Даний скрипт потрібно помістити в автозавантаження або запускати як logon скрипт групових політик.

PowerShell скрипт для email-повідомлення про закінчення терміну дії пароля

Якщо ви хочете індивідуально розсилати користувачам листи про те, що термін дії їх паролів скоро закінчиться, можна використовувати такий PowerShell скрипт.

$Sender = "info@winitpro.ru"
$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 адреса хоста, з якого розсилаються листи, в дозволені відправники без аутентифікації.

Leave a Reply

Your email address will not be published. Required fields are marked *