Exporte al archivo Get-ACL para el objeto de computadora AD y luego importe más tarde usando Set-ACL

Exporte al archivo Get-ACL para el objeto de computadora AD y luego importe más tarde usando Set-ACL

Me vendría bien un poco de ayuda. Mi Active Directory tiene 20 años, está a punto de comenzar a comprar alcohol legal y Dios sabe hacia dónde irá a partir de ahí...

Bromas aparte, Exchange ha devastado mis DACL de AD. Hasta el punto de que Exchange ni siquiera funciona correctamente. Construí un laboratorio con una estructura AD idéntica pero nueva en 2022-OS/2019-EX-CU12 solo para poder ver cómo se ven los permisos correctos.

¡EXCELENTE! Veo nuevamente todos los DACLS faltantes que necesito para un funcionamiento adecuado. ¿El problema? ¿Alguna vez ha intentado utilizar herramientas de permiso nativo avanzado para cosas complicadas como cosas de Exchange? Simplemente se bloquea, Dios sabe si lo estoy haciendo bien, uf...

Lo que preferiría hacer es esto en el lado limpio:

$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

Luego elimine los registros de fila del archivo de texto que no necesito importar; para aquellos que hago, modificaría el nombre de dominio en el archivo xml para que coincida con el lado de producción:

$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

Sin embargo, mis sueños fueron arruinados por este error en la línea "$acl.AddAccessRule($newACE)":

MethodException: No se puede convertir el argumento "regla", con valor: "System.DirectoryServices.ActiveDirectoryAccessRule", para que "AddAccessRule" escriba "System.DirectoryServices.ActiveDirectoryAccessRule": "No se puede convertir el valor "System.DirectoryServices.ActiveDirectoryAccessRule" de tipo "Deserializado .System.DirectoryServices.ActiveDirectoryAccessRule" para escribir "System.DirectoryServices.ActiveDirectoryAccessRule"."

Parece algo tan tonto como el hecho de que import-clixml cambie TODOS los objetos para agregar los deserializados. es el problema. Estoy bastante seguro de que los objetos son idénticos por lo demás. Irónicamente, estaba usando clixml para preservar el tipo de objeto.

¿Alguien tiene alguna magia para hacer que estos objetos no tengan el prefijo deserializado?

De lo contrario, ¿alguien tiene una forma decente de exportar un objeto AD DACL a un archivo de texto editable, con una forma de volver a importarlo? Lo único que debo hacer en el archivo de texto es eliminar filas innecesarias (que técnicamente puedo filtrar en el lado de origen) y cambiar el nombre de dominio de IdentityReference).

¡Salud!

Respuesta1

Puede usar el cmdlet Get-Acl en PowerShell para recuperar la DACL de un objeto AD. Aquí hay un comando de ejemplo que exporta el DACL de un objeto AD a un archivo CSV:

Get-Acl -Path "AD:\CN=ObjectDN,DC=DomainName,DC=com" | Seleccionar-Objeto -ExpandirPropiedad Acceso | Exportar-Csv -Ruta "C:\Ruta\A\Archivo.csv" -NoTypeInformation

Para volver a importar el DACL editado, puede usar el cmdlet Set-Acl en PowerShell. Aquí hay un comando de ejemplo que establece el DACL de un objeto AD desde un archivo CSV:

Set-Acl -Path "AD:\CN=ObjectDN,DC=DomainName,DC=com" -AclObject (Import-Csv -Path "C:\Path\To\File.csv" | ForEach-Object {Sistema de nuevo objeto .Security.AccessControl.FileSystemAccessRule ($.ReferenciaIdentidad,$.Derechos del sistema de archivos,$.InheritanceFlags,$.PropagationFlags,$_.AccessControlType)})

Respuesta2

No puedes arreglarlo, es decir, de forma nativa. El problema es que cuando un objeto se guarda en el disco (en su importación/exportación) se serializa. Cuando luego lo lees desde el disco, se deserializa. Aunque los objetos son idénticos desde su perspectiva (como en las mismas propiedades, etc.), como habrá visto, el nuevo objeto es del mismo tipo pero se ha deserializar al final. Por eso son objetos técnicamente diferentes.

Tuve el mismo problema por un tiempo con comandos completamente diferentes y, de hecho, me planteé una pregunta. Trabajé con alguien para resolverlo y entender más. Echa un vistazo.aquí. Pero para usted, la única solución es reconstruir el objeto manualmente :-( O no guardarlo en el disco.

EDITAR: Después de pensar un poco más, deberías poder lograr esto haciéndolo todo en un solo proceso. En lugar de exportar el DCAL primero (no podemos ver cómo obtuvo esto, pero puede usar powershell), simplemente ejecute esas líneas de código y guarde el objeto DACL en una variable y NO en un archivo. Esto lo mantendrá en su formato original y podrá transmitirlo correctamente.

información relacionada