Как известно, когда запрос попадает в папку 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.
Что-то RSS не обновляется :-(
спасибо за информацию, пофиксил RSS.
Comments: