AD 컴퓨터 개체에 대한 파일 Get-ACL로 내보낸 후 나중에 Set-ACL을 사용하여 가져오기

AD 컴퓨터 개체에 대한 파일 Get-ACL로 내보낸 후 나중에 Set-ACL을 사용하여 가져오기

도움이 좀 필요해요. 내 Active Directory는 20년이 되었습니다. 이제 곧 합법적인 주류를 구매하기 시작할 것이며, 그것이 어디로 가는지는 신만이 아실 것입니다...

농담은 제쳐두고 Exchange가 내 AD DACL을 황폐화시켰습니다. Exchange가 제대로 작동하지 않을 정도입니다. 올바른 권한이 어떻게 생겼는지 확인하기 위해 동일한 AD 구조를 사용하여 2022-OS/2019-EX-CU12에 새로운 랩을 구축했습니다.

엄청난! 올바른 작동에 필요한 누락된 DACLS가 다시 한 번 표시됩니다. 문제? 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: 값이 "System.DirectoryServices.ActiveDirectoryAccessRule"인 인수 "rule"을 "AddAccessRule"에 대해 "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 액세스 | 내보내기-Csv -경로 "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($.ID참조,$.파일시스템권리,$.상속플래그,$.PropagationFlags,$_.AccessControlType)})

답변2

당신은 그것을 고칠 수 없습니다. 기본적으로 그렇습니다. 문제는 개체가 디스크에 저장될 때(가져오기/내보내기 시) 직렬화된다는 것입니다. 그런 다음 디스크에서 다시 읽으면 역직렬화됩니다. 개체가 사용자의 관점에서 동일하더라도(동일한 속성 등), 보시다시피 새 개체는 동일한 유형이지만 마지막에 역직렬화되었습니다. 이 때문에 그들은 기술적으로 다른 개체입니다.

나는 완전히 다른 명령으로 같은 문제를 겪었고 실제로 나 자신에게 질문을 제기했습니다. 나는 그것을 알아내고 더 이해하기 위해 누군가와 협력했습니다. 살펴보세요여기. 하지만 유일한 해결책은 개체를 수동으로 다시 빌드하는 것입니다. :-( 아니면 디스크에 저장하지 마세요.

편집: 좀 더 생각해 본 후에는 모든 작업을 하나의 프로세스로 수행하여 이를 달성할 수 있습니다. 먼저 DCAL을 내보내는 대신(어떻게 얻었는지 알 수 없지만 powershell을 사용할 수 있음) 해당 코드 줄을 실행하고 DACL 개체를 파일이 아닌 변수에 저장하면 됩니다. 이렇게 하면 원래 형식으로 유지되므로 성공적으로 전달할 수 있습니다.

관련 정보