Экспорт в файл Get-ACL для объекта компьютера AD, а затем импорт с помощью Set-ACL

Экспорт в файл Get-ACL для объекта компьютера AD, а затем импорт с помощью Set-ACL

Мне нужна помощь. Моему Active Directory 20 лет, он вот-вот начнет покупать легальный алкоголь, и бог знает, что из этого выйдет...

Шутки в сторону, Exchange разрушил мои AD DACL. До такой степени, что Exchange даже не работает как надо. Я создал лабораторию с идентичной структурой AD, но новую на 2022-OS/2019-EX-CU12, просто чтобы увидеть, как выглядят правильные разрешения.

ОТЛИЧНО! Я снова вижу все недостающие DACLS, которые мне нужны для правильной работы. В чем проблема? Вы когда-нибудь пробовали использовать Advanced Native Permission tooling для таких кривых вещей, как Exchange? Он просто зависает, бог знает, правильно ли я это делаю, тьфу...

Я бы предпочел сделать это с более чистой стороны:

$acl = get-acl -path "AD:DC=prod,DC=widgets,DC=corp"
$acl.Access | ? {$_.IdentityReference -like "*Exchange*" -or $_.IdentityReference -like "*Organization*"} | export-CliXml -Path c:\temp\ftw.xml

Затем удалите записи строк из текстового файла, которые мне не нужно импортировать. Для тех, которые мне нужно импортировать, я бы изменил доменное имя в XML-файле, чтобы оно соответствовало рабочей стороне:

$CleanACLs = Import-Clixml C:\temp\ftw.xml
$TestVictom = "AD:CN=Poor User,OU=Employees,DC=prod,DC=myCompany,DC=corp"
$acl = get-acl -path $TestVictom
#Testing just one ACL
$NewACE = ($CleanACLs)[0]
$acl.AddAccessRule($newACE)
Set-Acl -Path $TestVictom -AclObject $acl

Однако мои мечты были разрушены этой ошибкой в ​​строке «$acl.AddAccessRule($newACE)»:

MethodException: Невозможно преобразовать аргумент "rule" со значением: "System.DirectoryServices.ActiveDirectoryAccessRule" для "AddAccessRule" в тип "System.DirectoryServices.ActiveDirectoryAccessRule": "Невозможно преобразовать значение "System.DirectoryServices.ActiveDirectoryAccessRule" типа "Deserialized.System.DirectoryServices.ActiveDirectoryAccessRule" в тип "System.DirectoryServices.ActiveDirectoryAccessRule"."

Кажется, это что-то такое же глупое, как и тот факт, что import-clixml меняет ВСЕ объекты, чтобы добавить десериализованные. является проблемой. Я почти уверен, что объекты в остальном идентичны. По иронии судьбы, я использовал clixml для сохранения типа объекта.

Есть ли у кого-нибудь магия, которая позволит сделать так, чтобы эти объекты не имели префикса deserialized?

В противном случае, у кого-нибудь есть приличный способ экспортировать DACL объекта AD в редактируемый текстовый файл, с возможностью повторного импорта? Единственное, что мне нужно сделать в текстовом файле, это удалить ненужные строки (которые я могу технически отфильтровать на стороне источника), а также изменить доменное имя IdentityReference).

Ваше здоровье!

решение1

Вы можете использовать командлет Get-Acl в PowerShell для получения DACL объекта AD. Вот пример команды, которая экспортирует DACL объекта AD в файл CSV:

Get-Acl -Path "AD:\CN=ObjectDN,DC=DomainName,DC=com" | Select-Object -ExpandProperty Access | Export-Csv -Path "C:\Path\To\File.csv" -NoTypeInformation

Чтобы повторно импортировать отредактированный DACL, вы можете использовать командлет Set-Acl в PowerShell. Вот пример команды, которая устанавливает DACL объекта AD из CSV-файла:

Set-Acl -Path "AD:\CN=ObjectDN,DC=DomainName,DC=com" -AclObject (Import-Csv -Path "C:\Path\To\File.csv" | ForEach-Object {New-Object System.Security.AccessControl.FileSystemAccessRule($.ИдентификацияСсылка,$.FileSystemRights,$.ФлагиНаследования,$.PropagationFlags,$_.AccessControlType)})

решение2

Вы не можете исправить это, изначально. Проблема в том, что когда объект сохраняется на диск (при импорте/экспорте), он сериализуется. Когда вы затем считываете его с диска, он десериализуется. Хотя объекты идентичны с вашей точки зрения (например, одинаковые свойства и т. д.), как вы могли заметить, новый объект имеет тот же тип, но десериализован в конце. Из-за этого они технически являются разными объектами.

У меня была та же проблема некоторое время с совершенно другими командами, и я поднял вопрос о себе на самом деле. Я работал с кем-то, чтобы разобраться и понять большеПосмотритездесь. Но для вас единственный выход — перестроить объект вручную :-( Или не сохранять его на диск.

EDIT: Немного подумав, вы должны быть в состоянии достичь этого, сделав все это в одном процессе. Вместо того, чтобы сначала экспортировать DCAL (мы не видим, как вы это получили, но вы можете использовать powershell), просто запустите эти строки кода и сохраните объект DACL в переменной, а НЕ в файле. Это сохранит его в исходном формате, и вы сможете успешно его передать.

Связанный контент