Главная

Tuesday, 5 October 2021

Напомни мне про пароль.

Всем привет.

Еще с выходом в свет Windows 2008 администраторы столкнулись с маленькой, но неприятной проблемой: оповещение об истечении срока действия пароля пользователя стало сиротливо появляться в самом неприметном правом углу экрана. С выходом Windows 10 его появление вообще приобрело случайный момент. Отсюда и смена паролей в последний момент под аккомпанемент отказов доступа, и негодование, почему вдруг перестал работать VPN, и что с этим делать в командировке или на удаленке. Конечно, не проблема года, но явление назойливое, эмоциональное и, как следствие, неприятное. 

Поэтому пишем Powershell скрипт. После анализа первоисточника я оставил у себя нижеследующий код: 

Import-Module ActiveDirectory

# Задаем пороги срабатывания уведомлений в днях за 5 дней и за 1. 

# Чаще нет смысла, пользователь либо реагирует либо бесполезно.)

$WarnDate = (get-date).adddays(5).ToLongDateString()

$AlarmDate = (get-date).adddays(1).ToLongDateString()


# Настройка тела сообщения напоминания

$MailSender = 'Monitor@forza.com'

$Subject    = 'Увага! Термін дії Вашого паролю закінчується.'

$EmailStub1 = ", термін дії Вашого паролю закінчується "

$EmailStub2 = "`nБудь ласка, подбайте про зміну вашого паролю. Або зверніться в сервіс-деск."

$EmailStub3 = "`n`nЦе нагадування створено автоматично, не відповідайте на нього."

$SmtpServer = 'mail.forza.com'


# Получаем список пользователей домена которые:

# не заблокированные ― Enabled -eq $True.

# у кого пароль имеет срок жизни ― PasswordNeverExpires -eq $False

# у кого вообще не установлен пароль ― PasswordLastSet -gt 0

# у кого есть емаил ― EmailAddress -like '*'.


$users = Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False -and PasswordLastSet -gt 0 -and EmailAddress -like '*'} `

 -Properties "Name", "EmailAddress", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "Name", "EmailAddress", `

 @{Name = "PasswordExpiry"; Expression = {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed").tolongdatestring() }}


# Сбрасываем полученый список для контроля:

$users | Export-Csv "d:\sources\Users.csv" -Encoding UTF8

# Задаем имя списка для тех кому будет отослано сообщение:

$filename5 = "d:\sources\Users5.csv"

$filename1 = "d:\sources\Users1.csv"


# Проверяем сроки действия и отправляем уведомления, и фиксируем ФИО пользователей в файлах.

foreach ($user in $users) {

     if ($user.PasswordExpiry -eq $WarnDate) {

         $EmailBody =  $user.name, $EmailStub1, $WarnDate, $EmailStub2, $EmailStub3 -join ' '

         $smtp = New-Object net.mail.smtpclient($SmtpServer)

         $smtp.Send($MailSender, $user.EmailAddress, $Subject, $EmailBody)

         $user.name + ', ' + $WarnDate | Out-File $filename5 -Append -Force -Encoding UTF8


    }

     elseif ($user.PasswordExpiry -eq $AlarmDate) {

         $EmailBody =  $user.name, $EmailStub1, $AlarmDate, $EmailStub2, $EmailStub3 -join ' '

         $smtp = New-Object net.mail.smtpclient($SmtpServer)

         $smtp.Send($MailSender, $user.EmailAddress, $Subject, $EmailBody)

         $user.name + ', ' + $WarnDate | Out-File $filename1 -Append -Force -Encoding UTF8

     }

    else {}

 }

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?