AD コンピュータ オブジェクトの Get-ACL をファイルにエクスポートし、後で Set-ACL を使用してインポートします。

AD コンピュータ オブジェクトの Get-ACL をファイルにエクスポートし、後で Set-ACL を使用してインポートします。

助けが必要です。私の Active Directory は 20 年前のもので、合法的なアルコールの購入を開始しようとしていますが、これからどうなるかは神のみぞ知るところです...

冗談はさておき、Exchange は私の AD DACL を破壊しました。Exchange が正しく動作しないほどです。正しいアクセス許可がどのようになっているかを確認するために、2022-OS/2019-EX-CU12 で同一の AD 構造を持つ新しいラボを構築しました。

素晴らしい! 適切な操作に必要な、不足している DACL がすべて再び表示されます。問題は? Exchange などの厄介な機能に Advanced Native Permission ツールを使用したことはありますか? ロックされてしまうので、正しく実行できているかどうかさえ神のみぞ知る、うーん...

私がやりたいのは、クリーンな面ではこれです:

$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 を使用していました。

これらのオブジェクトに deserialized のプレフィックスを付けないようにする魔法を持っている人はいますか?

それ以外の場合、AD オブジェクト DACL を編集可能なテキスト ファイルにエクスポートし、再インポートする適切な方法はありますか? テキスト ファイルで行う必要があるのは、不要な行を削除すること (技術的にはソース側でフィルター処理できます) と、IdentityReference のドメイン名を変更することだけです。

乾杯!

答え1

PowerShell の Get-Acl コマンドレットを使用して、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 コマンドレットを使用できます。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($.IdentityReference,$.ファイルシステム権限,$.継承フラグ、$.PropagationFlags、$_.AccessControlType)})

答え2

ネイティブでは修正できません。問題は、オブジェクトがディスクに保存されるとき (インポート/エクスポート時) にシリアル化されることです。その後、それをディスクから読み戻すと、シリアル化解除されます。オブジェクトは、ユーザーの観点からは同一 (プロパティなどが同じ) ですが、新しいオブジェクトは同じタイプですが、最後にシリアル化解除されています。このため、技術的には異なるオブジェクトです。

私はまったく異なるコマンドで同じ問題を抱えており、実際に自分自身に疑問を抱いていました。私はそれを理解するために誰かと協力し、さらに理解するために見てくださいここただし、唯一の修正方法は、オブジェクトを手動で再構築することです :-( または、ディスクに保存しないでください。

編集: もう少し考えてみると、これをすべて 1 つのプロセスで実行することで実現できるはずです。最初に DCAL をエクスポートする代わりに (これをどのように取得したかはわかりませんが、PowerShell を使用できます)、これらのコード行を実行して、DACL オブジェクトをファイルではなく変数に保存します。これにより、元の形式が維持され、正常に渡すことができます。

関連情報