06 марта 2014

Уведомление о истечении пароля по e-mail с помощью PowerShell

Легенда:
Мы администратор домена domain.test крупного предприятия. Согласно политике безопасности, срок действия пароля в нашей Active Directory - 60 дней. В нашей компании имеются сотрудники которые используют свои учетные записи только для использования почтовых ящиков на мобильных устройствах либо же с помощью OWA (Outlook Web Access), так же некоторые пользователи Windows 7 жалуются что система не предупреждала их о истечении срока действия пароля (всплывающую подсказку действительно легко игнорировать или не заметить).

Задача:
Организовать процедуру уведомления пользователей которые используют только почтовые ящики, и никогда не используют свои учетные записи для входа на компьютерах предприятия. Так же сделать уведомление таким что бы его было трудно игнорировать в системе Windows 7.

Решение:
Мы решим эту задачу добавлением скрипта, который будет отправлять уведомление о истечении пароля на почту.
# Берем текущую дату и возвращаемся на 53 дня назад. То есть уведомлять будем за 7 дней до истечения срока действия пароля
$pdate = (Get-Date).AddDays(-53).ToFileTime()

# Подключаем модуль Active Directory
Import-Module ActiveDirectory

# Делаем выборку пользователей, учетные записи которых включены, пароль изменен более 53 дней ранее, исключаем тех, у кого срок действия пароля не ограничен, у кого отсутствует e-mail адрес, и тек кто никогда не логинился
$pusers = Get-ADUser -Filter {(Enabled -eq $true) -and (pwdLastSet -le $pdate) -and (PasswordNeverExpires -eq $false)} -Properties pwdLastSet,mail,lastLogonTimestamp | Where-Object {$_.mail -ne $null -and $_.lastLogonTimestamp -ne $null}

# Выполняем для каждого выбранного объекта цыкл
foreach ($puser in $pusers) {

# Дата изменения пароля у нашего юзера
$pwdLastSet = $puser.pwdLastSet
# Сегодняшняя дата
$tdate = (Get-Date).ToFileTime()
# Конвертируем, что бы можно было увеличить значение
$pwdLastSet = [DateTime]::FromFileTime($pwdLastSet)
# Прибавляем к дате последней смены пароля 60 дней, тем самым получая дату истечения пароля, и конвертируем обратно для дальнейшей обработки
$pwdLastSet = $pwdLastSet.AddDays(+60).ToFileTime()

# Если дата истечения пароля еще не наступила, то есть она больше сегодняшней даты
if ($pwdLastSet -gt $tdate) {
# Конвертируем для отправки даты истечения по почте
$pwdLastSet = [DateTime]::FromFileTime($pwdLastSet)
$pwdLastSet = $pwdLastSet.ToLongDateString()

# Данные для отправки почты
$Subject = "Уведомление о необходимости смены пароля"
$Server = "mail.domain.test"
$From = "noreply@domain.test"
$secpasswd = ConvertTo-SecureString "pa$$w0rd" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential("noreply@domain.test", $secpasswd)


# Отправляем e-mail юзеру
$email = $puser.mail
$To = "$email"
$body = "Срок действия вашего пароля истекает $pwdLastSet Настоятельно рекомендуем вам сменить пароль!”
Send-MailMessage -From $From -To $To -SmtpServer $Server -Body "$body" -Subject $Subject -credential $mycreds
}
}
# Если же пароль уже истек, нет смысла отправлять уведомление, пользователь всё равно не сможет его прочесть, пока не сменит пароль.

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