Contents of this directory is archived and no longer updated.

Не каждый знает, что центр сертификации Windows поддерживает не одну, а несколько таблиц:

  1. Таблица запросов (что мы видим в оснастке certsrv.msc);
  2. Таблица списков отзывов (CRL Table);
  3. Таблица атрибутов;
  4. Таблица расширений.

Мы уже знаем, как обращаться к таблице запросов. По схожему принципу можно обращаться и к другим таблицам. Для переключения между ними используется метод SetTable интерфейса ICertView2. По умолчанию всегда используется таблица CVRC_TABLE_REQCERT. Вот какие кодовые номера у таблиц:

  • CVRC_TABLE_ATTRIBUTES = 0x4000
  • CVRC_TABLE_CRL = 0x5000
  • CVRC_TABLE_EXTENSIONS = 0x3000
  • CVRC_TABLE_REQCERT = 0

Метод SetTable нужно вызывать сразу после вызова метода OpenConnection. Таблица CRL'ов хранит историю всех CRL'ов (вместе с самими CRL'ами), которые были сгенерированы сервером CA, а так же прочую полезную информацию.

Вот как смотрится схема этой таблицы:

$CA = "dc1\Contoso CA"
$CaView = New-Object -ComObject CertificateAuthority.View
# открываем подключение к CA
$CaView.OpenConnection($CA)
# указываем необходимую таблицу
$CaView.SetTable(0x5000)
# говорим, что мы хотим посмотреть схему
$Columns = $CaView.EnumCertViewColumn(0)
# начинаем итерацию по столбцам БД
[void]$Columns.Next()
do {
    # создаём временный объект, чтобы получить красивый вывод и наполняем его данными
    $Column = "" | Select Name, DisplayName, Type, MaxLength
    $Column.Name = $Columns.GetName()
    $Column.DisplayName = $Columns.GetDisplayName()
    $Column.Type = switch ($Columns.GetType()) {
        1 {"Long"}
        2 {"DateTime"}
        3 {"Binary"}
        4 {"String"}
    }
    [string]$Column.MaxLength = $Columns.GetMaxLength()
    if ($Columns.IsIndexed() -eq 1) {$Column.MaxLength += ", Indexed"}
    $Column
} until ($Columns.Next() -eq -1)
# закрываем подключение к БД
$Columns.Reset()

Её вид:

Name                          DisplayName                   Type                          MaxLength
----                          -----------                   ----                          ---------
CRLRowId                      CRL Row ID                    Long                          4, Indexed
CRLNumber                     CRL Number                    Long                          4, Indexed
CRLMinBase                    CRL Minimum Base Number       Long                          4
CRLNameId                     CRL Name ID                   Long                          4
CRLCount                      CRL Count                     Long                          4
CRLThisUpdate                 CRL This Update               DateTime                      8
CRLNextUpdate                 CRL Next Update               DateTime                      8, Indexed
CRLThisPublish                CRL This Publish              DateTime                      8
CRLNextPublish                CRL Next Publish              DateTime                      8, Indexed
CRLEffective                  CRL Effective                 DateTime                      8
CRLPropagationComplete        CRL Propagation Complete      DateTime                      8, Indexed
CRLLastPublished              CRL Last Published            DateTime                      8, Indexed
CRLPublishAttempts            CRL Publish Attempts          Long                          4, Indexed
CRLPublishFlags               CRL Publish Flags             Long                          4
CRLPublishStatusCode          CRL Publish Status Code       Long                          4, Indexed
CRLPublishError               CRL Publish Error Information String                        8192
CRLRawCRL                     CRL Raw CRL                   Binary                        536870912

Вот пример вывода:

$CA = "dc1\Contoso CA"
$CaView = New-Object -ComObject CertificateAuthority.View
$CaView.OpenConnection($CA)
$CaView.SetTable(0x5000)
$ColumnCount = $CaView.GetColumnCount(0)
$CaView.SetResultColumnCount($ColumnCount)
0..($ColumnCount - 1) | %{$CAView.SetResultColumn($_)}
$Row = $CaView.OpenView()
[void]$Row.Next()
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 $($Column.GetDisplayName()) -Value $($Column.GetValue(1)) -Force
    }
    $Cert
    $Column.Reset()
}
$Row.Reset()
CRL Row ID                    : 409
CRL Number                    : 347
CRL Minimum Base Number       : 340
CRL Name ID                   : 1
CRL Count                     : 0
CRL This Update               : 2010.02.25. 17:55:51
CRL Next Update               : 2010.02.26. 19:15:51
CRL This Publish              : 2010.02.25. 18:05:51
CRL Next Publish              : 2010.02.26. 18:05:51
CRL Effective                 : 2010.02.18. 17:55:51
CRL Propagation Complete      : 2010.02.25. 19:05:51
CRL Last Published            : 2010.02.25. 18:05:51
CRL Publish Attempts          : 1
CRL Publish Flags             : 6
CRL Publish Status Code       : 0
CRL Publish Error Information : -
CRL Raw CRL                   : MIICzDCCAbQCAQEwDQYJKoZIhvcNAQEFBQAwQzETMBEGCgmSJomT8ixkARkWA2Nv
                                bTEXMBUGCgmSJomT8ixkARkWB2NvbnRvc28xEzARBgNVBAMTCkNvbnRvc28gQ0EX
                                DTEwMDIyNTE3NTU1MVoXDTEwMDIyNjE5MTU1MVqgggE7MIIBNzAfBgNVHSMEGDAW
                                gBQSyac4taTAA9cqtmWlsPEzGBKsPzAQBgkrBgEEAYI3FQEEAwIBATALBgNVHRQE
                                BAICAVswHAYJKwYBBAGCNxUEBA8XDTEwMDIyNjE4MDU1MVowDgYDVR0bAQH/BAQC
                                AgFUMIHGBgkrBgEEAYI3FQ4EgbgwgbUwgbKgga+ggayGgalsZGFwOi8vL0NOPUNv
                                bnRvc28lMjBDQSxDTj1EQzEsQ049Q0RQLENOPVB1YmxpYyUyMEtleSUyMFNlcnZp
                                Y2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9Y29udG9zbyxEQz1j
                                b20/ZGVsdGFSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3Ry
                                aWJ1dGlvblBvaW50MA0GCSqGSIb3DQEBBQUAA4IBAQB3DuZRToyK/OkrnCQQUl1P
                                qgv/V9nPhAR6LF/b25Tq7fhKZniAk/cPgj2L3IMsLx2lmrI7GEEDt4UDcuc3EPtF
                                f7gixrN3K+eSE/Er0NxBdJFUhHK9e/CVXqJFV2pGSa77mvcI75l2h5mlUGDZzGOl
				<...>
<...>

Что касается остальных двух таблиц, то они, как я уже говорил, работают по тому же принципу и вы так же можете накладывать фильтры вывода методом SetRestriction. Они содержат ту же информацию, что вы видите в оснастке CertSrv.msc, когда выделяете запрос, нажимаете Action –> All Tasks –> View Attributes/Extensions.

На этом я завершаю цикл статей по работе с базой данных центров сертификации Windows с помощью Windows PowerShell.


Share this article:

Comments:

Comments are closed.