Давеча появилась задача сделать оповещение пользователей об истечении срока действия сертификата на 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("servNEWCERTSERV")
#поля БД сертификатов, которые нам пригодятся
$properties = "RequestID","RequesterName","NotAfter"
$CaView.SetResultColumnCount($properties.Count)
$properties | %{$CAView.SetResultColumn($CAView.GetColumnIndex($False, $_))}
#создаём Фильтры по колонке NotAfter
$RColumn = $CAView.GetColumnIndex($False, "NotAfter")
$CaView.SetRestriction($RColumn,0x8,0,[datetime]::Now)
$CaView.SetRestriction($RColumn,0x4,0,(Get-Date).AddDays(+7))
#получаем список истекающих сертификатов
$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.