Сбор информации о сертификатах пользователей 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 

 

автоматизация рецепты