Как стать автором
Обновить

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

Время на прочтение3 мин
Количество просмотров5.9K
Давеча появилась задача сделать оповещение пользователей об истечении срока действия сертификата на eToken, с помощью которого они авторизуются на рабочих местах.
Сертификаты на eToken генерируются через Центр сертификации Windows сроком на 1 год. Оповещать пользователей необходимо было за неделю, чтобы те могли своевременно прийти в ИТ отдел продлить.
Задача осложнялась тем, что в сертификатах не был указан адрес почты владельца. И следовательно нужно было брать этот адрес из АД.
Компания Aladdin предлагает для этой цели свой софт Token Management System, но для этого надо заплатить да и использовать её только для оповещения как-то не правильно.
Основным ресурсом для написание сего скрипта был сайтик (тут кстати много и хорошо написано про работу с центром сертификации через PowerShell).
Для поиска почтового адреса пользователя в АД, я использовал модуль ActiveRoles Management Shell for Active Directory, скачать модуль для работы с АД можно здесь www.quest.com/powershell/activeroles-server.aspx
У меня на Win7 поставилось без проблем, а вот для установки на XP или 2003 нужно доставлять компоненты. По подробней об этом с ссылками на скачивание и описанием команд написано здесь.

#добавление модуля для работы с АД
Add-PSSnapin Quest.ActiveRoles.ADManagement

#создаётся объект и соединение с сервером сертификации
$CaView = New-Object -ComObject CertificateAuthority.View
$CaView.OpenConnection("serv\NEWCERTSERV")

#поля БД сертификатов, которые нам пригодятся
$properties = "RequestID","RequesterName","NotAfter"
$CaView.SetResultColumnCount($properties.Count)
$properties | %{$CAView.SetResultColumn($CAView.GetColumnIndex($False, $_))}

#создаём Фильтры, чтобы выбрать сертификаты истекающие через 7 дней
$RColumn = $CAView.GetColumnIndex($False, "NotAfter")
$CaView.SetRestriction($RColumn,0x8,0,[datetime]::Now)
$CaView.SetRestriction($RColumn,0x4,0,(Get-Date).AddDays(+7))
#создаём Фильтры, чтобы выбрать только действующие сертификаты
$RColumn = $CAView.GetColumnIndex($False, "Disposition")
$CaView.SetRestriction($RColumn,1,0,20)

#получаем список истекающих сертификатов
$Certs=@()
$Row = $CaView.OpenView()
while ($Row.Next() -ne -1) {
$Cert = New-Object psobject
$Column = $Row.EnumCertViewColumn()
while ($Column.Next() -ne -1) {
$current = $Column.GetName()
$Cert | Add-Member -MemberType NoteProperty -Name $($Column.GetName()) -Value $($Column.GetValue(1)) -Force
}
$Certs+=$Cert
$Column.Reset()
}
$Row.Reset()

#в этой переменной будет храниться текст письма администраторам
$Body=""
#а в этой текст письма для каждого пользователя
$Body_One=""
#создаём соединение с почтовым сервером
$smtp = New-Object net.mail.smtpclient("mailserv")
#формируем тело письма
foreach ($i in $Certs){
$Body_One+="№: "
$Body_One+=$i.RequestID
$Body_One+=", владелец: "
$Body_One+=$i.{Request.RequesterName}
$Body_One+=", истекает: "
$Body_One+=$i.NotAfter
$Body_One+="`n"

#узнаём почту пользователя, выбрав её из АД
$user_mail = Get-QADUser $i.{Request.RequesterName} -DontUseDefaultIncludedProperties -IncludedProperties 'mail' -SerializeValues
#отравляем писмо пользователю
$smtp.Send("notice@domain.ru", $user_mail.mail, "eToken, истекающие сертификаты.", $Body_One+"Для получения нового сертификата Вам необходимо подойти с eToken'ом к сотруднику ИТ отдела в кабинет 666.")

$Body+=$Body_One
$Body_One=""
}
#отправляем письма администраторам
If ($Body -ne ""){
$smtp.Send("notice@domain.ru", "adm1@domain.ru", "eToken, истекающие сертификаты.", $Body)
$smtp.Send("notice@domain.ru", " adm1@domain.ru", "eToken, истекающие сертификаты.", $Body)
$smtp.Send("notice@domain.ru , " adm1@domain.ru", "eToken, истекающие сертификаты.", $Body)
}


Для того чтобы запустить скрипт из файла в PowerShell выполните команду Set-ExecutionPolicy RemoteSigned.
Теги:
Хабы:
Всего голосов 7: ↑5 и ↓2+3
Комментарии0

Публикации

Истории

Работа

Ближайшие события