Сбор информации о сертификатах пользователей AD CS
Дата выхода: 21 января 2024 г.
Редактировался: 21 января 2024 г.
Если в вашей инфраструктуре настроена аутентификация пользователей по сертификатам AD CS, то возможно возможно вам пригодится следующий скрипт.
Скрипт ниже позволяет получить отчёт (CSV) по сертификатам пользователей с датой начала и окончания их действия. Предполагается что данный скрипт будет запускаться с ПК имеющего доступ к AD CS.
#Выгружаю пользователей из OU Employees
#В данном случае русскоязычные ФИО сотрудника указаны в extensionattribute11, extensionattribute12, extensionattribute13
$AD_users = Get-ADUser -SearchBase "OU=Employees, DC=domain, DC=com" -Filter '*' -Properties certificates, extensionattribute11, extensionattribute12, extensionattribute13, department
#Создаю переменную для сбора информации о всех пользователях
$All_user_cert_info = @()
#Пробегаюсь по списку пользователей
ForEach ($user in $AD_users)
{
#Складываю ФИО пользователя на русском языке
#Если в вашем случае ФИО не хранятся в extensionattr то используйте $user.Name или $user.CN
$FIO = $user.extensionattribute11 + " " + $user.extensionattribute12 + " " + $user.extensionattribute13
#Выгружаю информацию о дате начала действия и дате окончания действия сертификата пользователя
$cert_info = $user.certificates | foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_} | select NotBefore, NotAfter
#Компоную информации в приемлемый вид
$user_cert_info = @{
"Отдел" = [string]$user.department;
"ФИО" = [string]$FIO
"АД имя" = [string]$user.SamAccountName;
"Дата начала действия сертификата" = ([string]$cert_info.NotBefore).split(' ')[0];
"Дата окончания действия сертификата" = ([string]$cert_info.NotAfter).split(' ')[0];
}
#Собираю информации в одну переменную
$All_user_cert_info += [pscustomobject]$user_cert_info
}
#Выгружаю всё в CSV-файл
$All_user_cert_info | Export-Csv C:\Script_answer\All_User_Cert_INFO\$((Get-Date).ToString('dd-MM-yyyy')).csv -notype -UseCulture -Encoding UTF8
Если отчёта представленного выше вам недостаточно то предлагаю следующий скрипт, который будет так же выгружать информацию о пользовательских сертификатах и отправлять на почту письмо с информацией о 15 сертификатах срок действия которых приближается к концу.
function RenewDate ([string]$date) {
$date = $date.Split('/')[1] + '.' + $date.Split('/')[0] + '.' + $date.Split('/')[2]
return $date
}
#Выгружаю пользователей из OU Employees c информацией о сертификатах, русскоязычном ФИО и отделе
#В данном случае русскоязычные ФИО сотрудника указаны в extensionattribute11, extensionattribute12, extensionattribute13
$AD_users = Get-ADUser -SearchBase "OU=Employees, DC=domain, DC=com" -Filter '*' -Properties certificates, extensionattribute11, extensionattribute12, extensionattribute13, department
#Создаю переменную для сбора инфрмации о всех пользователях
$All_user_cert_info = @()
#Пробегаюсь по списку пользователей
ForEach ($user in $AD_users)
{
#Складываю ФИО пользователя на русском языке
#Если в вашем случае ФИО не хранятся в extensionattr то используйте $user.Name или $user.CN
$FIO = $user.extensionattribute11 + " " + $user.extensionattribute12 + " " + $user.extensionattribute13
#Выгружаю информацию о дате начала действия и дате окончания действия сертификата пользователя
$cert_info = $user.certificates | foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_} | select NotBefore, NotAfter
$begin_date = ([string]$cert_info.NotBefore).split(' ')[0]
$end_date = ([string]$cert_info.NotAfter).split(' ')[0]
#Если в дате используется в качестве разделителя / то меняем его на точки
if ($begin_date.Contains('/'))
{
$begin_date = RenewDate($begin_date)
}
if ($end_date.Contains('/')) {
$end_date = RenewDate($end_date)
}
#Компоную инорфмацию в приемлемый вид
$user_cert_info = @{
"Department" = [string]$user.department;
"FIO" = [string]$FIO
"Logon_name" = [string]$user.SamAccountName;
"begin_date" = $begin_date
"end_date" = $end_date
}
#Собираю инофрмацию в одну переменную
$All_user_cert_info += [pscustomobject]$user_cert_info
}
#Убираем сотрудников без сертификатов из списка и сортируем данные по дате окончания действия сертификата
$All_user_cert_info = $All_user_cert_info | Where-Object {$_.end_date -ne ''} | Sort-Object {[datetime]::parse($_.end_date)}
$body = ' <h3 style="font-family: Calibri">Информация об истекающих сертификатах сотрудников</h3>
<p style="font-family: Calibri">Если у сотрудника скоро истечёт сертификат то с ними необходимо связаться для последующей замены сертификата</p>
<table style="width:100%">
<thead style="font-family: Calibri">
<tr>
<th>AD имя</th>
<th>ФИО</th>
<th>Отдел</th>
<th>Дата окончания действия сертификата</th>
</tr>
</thead>
<tbody style="font-family: Calibri">'
foreach ($item in $All_user_cert_info[0..15])
{
$body += '<tr><th>' + $item.Logon_name + '</th>' + '<th>' + $item.FIO + '</th>' + '<th>' + $item.Department + '</th>' + '<th>' + $item.end_date + '</th></tr>'
}
$body += '</tbody></table>'
$message = @{
From = 'Отчёты IT <admin@domain.com>'
To = 'another@domain.com'
Subject = 'Отчёт IT: истекающие сертификаты сотрудников'
Body = $body
SmtpServer = 'mail.domain.com'
Encoding = 'UTF8'
}
Send-MailMessage -BodyAsHtml @message
автоматизация
рецепты