导出到 AD 计算机对象的 Get-ACL 文件,然后稍后使用 Set-ACL 导入

导出到 AD 计算机对象的 Get-ACL 文件,然后稍后使用 Set-ACL 导入

我需要一些帮助。我的 Active Directory 已有 20 年历史,它即将开始购买合法酒精,天知道它接下来会去哪里……

玩笑归玩笑,Exchange 已经破坏了我的 AD DACL。Exchange 甚至无法正常工作。我建立了一个具有相同 AD 结构但在 2022-OS/2019-EX-CU12 上更新的实验室,这样我就能知道正确的权限是什么样的。

太棒了!我再次看到了正常运行所需的所有缺失的 DACL。问题是什么?您是否曾尝试使用高级本机权限工具来处理像 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:无法将“AddAccessRule”的参数“rule”(值为“System.DirectoryServices.ActiveDirectoryAccessRule”)转换为类型“System.DirectoryServices.ActiveDirectoryAccessRule”:“无法将类型“Deserialized.System.DirectoryServices.ActiveDirectoryAccessRule”的“System.DirectoryServices.ActiveDirectoryAccessRule”值转换为类型“System.DirectoryServices.ActiveDirectoryAccessRule”。

问题似乎在于 import-clixml 会更改所有对象以添加反序列化对象,这似乎很愚蠢。我相当确定这些对象在其他方面是相同的。讽刺的是,我使用 clixml 来保留对象类型。

有人有什么魔法可以让这些对象不带有反序列化的前缀吗?

否则,有人有办法将 AD 对象 DACL 导出到可编辑文本文件,并重新导入吗?我在文本文件中需要做的唯一事情就是删除不需要的行(我可以在源端进行技术过滤)以及更改 IdentityReference 的域名。

干杯!

答案1

您可以使用 PowerShell 中的 Get-Acl cmdlet 来检索 AD 对象的 DACL。以下是将 AD 对象的 DACL 导出到 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,可以使用 PowerShell 中的 Set-Acl cmdlet。以下是从 CSV 文件设置 AD 对象的 DACL 的示例命令:

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($.身份引用,$.文件系统权限,$.继承标志,$.PropagationFlags,$_.AccessControlType)})

答案2

您无法修复它,也就是说无法在本机修复它。问题是,当对象保存到磁盘(在导入/导出时)时,它会被序列化。当您从磁盘读取该对象时,它会被反序列化。虽然从您的角度来看对象是相同的(如具有相同的属性等),但正如您所看到的,新对象是相同类型的,但最终已被反序列化。因此,从技术上讲,它们是不同的对象。

有一段时间,我遇到了同样的问题,但使用了完全不同的命令,实际上我自己也遇到了一个问题。我和别人一起弄清楚了这个问题,要了解更多信息,请查看这里。但对于您来说,唯一的解决方法是手动重建对象 :-( 或者不要将其保存到磁盘。

编辑:经过进一步思考,您应该能够通过在一个过程中完成所有操作来实现这一点。无需先导出 DCAL(我们不知道您是如何导出的,但您可以使用 powershell),只需运行这些代码行并将 DACL 对象保存到变量而不是文件中。这将使其保持原始格式,并且您将能够成功传递它。

相关内容