Рейтинг:0

Как я могу установить ACL ЦС программно?

флаг th

При запуске консоли ЦС (certsrv.msc), я могу щелкнуть правой кнопкой мыши свой ЦС, выбрать Характеристики а затем я могу изменить ACL моего ЦС в Безопасность вкладка Когда я изменяю его, изменения применяются к объекту AD по адресу:

CN=MY-CA,CN=Enrollment Services,CN=службы открытых ключей,CN=Services,CN=Configuration,DC=contoso,DC=com

Когда я просматриваю его в редакторе ADSI, измененные записи ACL не наследуются, а применяются напрямую (как и ожидалось). Но когда я изменяю ACL этого объекта программно, т.е. г. к:

Import-Module ActiveDirectory
$path = 'AD:CN=MY-CA,CN=Enrollment Services,CN=Services Public Key,CN=Services,CN=Configuration,DC=contoso,DC=com'
$acl = Get-Acl-путь
$acl.AddAccessRule(...)
Set-Acl -Путь $path -AclObject $acl

Затем я вижу эти изменения в редакторе ADSI, но не вижу этих изменений, когда просматриваю ACL моего ЦС через консоль ЦС.

Итак, я делаю что-то не так? Должен ли я программно изменять и другие объекты?


Что я пробовал:

  • После изменения я заставил AD синхронизироваться с: repadmin/syncall/Aed
  • Я перезапустил службу ЦС certsvc

Но это не похоже на проблему "синхронизации"...

Рейтинг:2
флаг cn

Эти ACL несколько отличаются. ACL для объекта AD влияет только на запись AD, и они не распространяются на CA.

ACL, которые вы видите в консоли CA Management, хранятся в конфигурации CA в реестре.

Я не уверен, есть ли простой способ редактировать разрешения в CA с помощью PowerShell изначально (без сторонних инструментов). Тем не менее, я бы рекомендовал использовать PKI PowerShell модуль для упрощения задачи. Модуль содержит несколько команд, связанных с ACL:

p.s. Я автор этого модуля PSPKI

Каждая команда имеет встроенную и интерактивную справку с полезными примерами использования каждой команды.

флаг cn
Вы должны перезапустить службу CA после записи в реестр. CA считывает конфигурацию только при запуске службы и не ищет изменений до следующего запуска.
Рейтинг:0
флаг th

Благодаря указателям Склеп32 и некоторые дополнительные источники1, я придумал кроме того необходимые изменения, которые необходимо внести в реестр ЦС:

# Получить бинарный дескриптор безопасности ЦС из реестра
$sd_bin = Get-ItemPropertyValue -Path 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\MY-CA' -Name 'Security'

# Создать из него объект дескриптора безопасности
$sd = New-Object -TypeName System.Security.AccessControl.CommonSecurityDescriptor -ArgumentList @($false, $false, $sd_bin, 0)

# Измените DACL на месте
$sd.DiscretionaryAcl.AddAccess([System.Security.AccessControl.AccessControlType]::Allow, "<SID>", <INT32_PERMISSIONS>, [System.Security.AccessControl.InheritanceFlags]::None, [System.Security.AccessControl. Флаги распространения]:: Нет)

# Преобразование дескриптора безопасности обратно в двоичную форму
$sd_bin_new = [System.Byte[]]::CreateInstance([System.Byte], $sd.BinaryLength)
$sd.GetBinaryForm($sd_bin_new, 0)

# Записать обратно в реестр
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\MY-CA' -Name 'Security' -Value $sd_bin_new

# Перезапуск службы сертификатов
Служба перезапуска — имя CertSvc

1Дальнейшее чтение:

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.