Как известно, когда запрос попадает в папку Pending Requests, администратор CA должен что-то с ним явно сделать — или одобрить или отклонить. Это можно сделать при помощи оснастки CetSrv.msc или при помощи PowerShell. Ещё можно через certutil, но речь сегодня не о нём. Если вспомнить предыдущие посты посвящённые CryptoAPI и PowerShell, можно вспомнить какие-то основные принципы. Как обычно, мы будем использовать интерфейс ICertAdmin2. Для аппрува соответствующих запросов необходимо воспользоваться методом
ResubmitRequest(). Как вы видите, метод принимает 2 аргумента:
HRESULT ResubmitRequest(
[in] const BSTR strConfig,
[in] LONG RequestId,
[out, retval] LONG *pDisposition
);
это конфигурационная строка CA вида: CAComputerName\CAName и номер запроса. И в ответ метод возвращает результат выполнения операции. Вот как это можно аккуратно сделать в PowerShell:
function Issue-PendingRequest {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFomPipeline = $true)]
[string]$CAConfig,
[Parameter(Mandatory = $true)]
[int]$RequestID
)
try {$CertAdmin = New-Object -ComObject CertificateAuthority.Admin}
catch {Write-Warning "Unable to instantiate ICertAdmin2 object!"; return}
try {
$status = switch ($CertAdmin.ResubmitRequest($CAConfig,$RequestID)) {
0 {"The request was not completed."}
1 {"The request failed."}
2 {"The request was denied"}
3 {"The certificate was issued."}
4 {"The certificate was issued separately."}
5 {"The request was taken under submission."}
6 {"The certificate is revoked."}
}
}
catch {$_; return}
Write-Host "Operation status for the request '$RequestID': $ststus"
}
Для отклонения запроса, следует воспользоваться методом DenyRequest(). Как и метод ResubmitRequest тоже принимает всего 2 аргумента, но кроме ошибок ничего не возвращает:
HRESULT DenyRequest(
[in] const BSTR strConfig,
[in] Long RequestId
);
И код будет очень похож на предыдущий:
function Deny-PendingRequest {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFomPipeline = $true)]
[string]$CAConfig,
[Parameter(Mandatory = $true)]
[int]$RequestID
)
try {$CertAdmin = New-Object -ComObject CertificateAuthority.Admin}
catch {Write-Warning "Unable to instantiate ICertAdmin2 object!"; return}
try {$CertAdmin.DenyRequest($CAConfig,$RequestID)}
catch {$_; return}
Write-Host "Successfully denied request '$RequestID'"
}
вот так легко можно программным способом управлять реквестами из папки Pending Requests без графических оснасток или certutil. Что касается certutil, я не уверен, что он сможет заапрувить или отклонить реквест на удалённом CA. У него есть параметр –config, но я не уверен, что он работает в данном случае. Плюс, когда я выложу в общий доступ свой PS модуль для PKI, эта операция будет ещё проще. Вам не придётся вручную набивать конфигурационную строку, а просто воспользоваться командой Get-CertificationAuthority.