匯出到 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:無法轉換參數“rule”,值為:“System.DirectoryServices.ActiveDirectoryAccessRule”,對於“AddAccessRule”鍵入“System.DirectoryServices.ActiveDirectoryAccessRule”:“無法轉換類型為“Deserialized”的“System.DitoryService.System.rectory. .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=網域,DC=com" |選擇物件-展開屬性存取 | 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 {新物件系統. Security.AccessControl.FileSystemAccessRule($.IdentityReference,$.檔案系統權限,$.繼承標誌,$.PropagationFlags,$_.AccessControlType)})

答案2

你無法修復它,本質上就是這樣。問題是,當物件保存到磁碟(在匯入/匯出時)時,它會被序列化。然後,當您從磁碟讀回該資料時,它會被反序列化。儘管從您的角度來看,這些物件是相同的(如相同的屬性等),但正如您所看到的,新物件具有相同的類型,但最終已反序列化。因此,它們在技術上是不同的對象。

我有一段時間使用完全不同的命令遇到了同樣的問題,並且實際上對自己提出了一個問題。我和某人一起解決了這個問題並了解更多請看一下這裡。但對您來說,唯一的解決方法是手動重建物件:-( 或不將其儲存到磁碟。

編輯:再想一想,您應該能夠透過在一個過程中完成這一切來實現這一目標。不必先匯出 DCAL(我們看不到你是如何得到它的,但你可以使用 powershell),只需執行這些程式碼行並將 DACL 物件保存到變數而不是檔案中。這將使其保持原始格式,並且您將能夠成功地通過它。

相關內容