jakiś czas temu pisałem o fajnym narzędziu do sprawdzenia uprawnień w AD – AD ACL Scanner. chciałem użyć go do przeniesienia uprawnień między domenami… i okazało się, że nie jest to wcale takie proste:
- plik csv, który jest generowany jako raport, nie zawiera nagłówka – a więc nie wiadomo co oznaczają poszczególne wartości
- wartości w raporcie HTML mają nagłówki… ale nie wszystkie i nie takie same
- no i nawet jeśli znam nagłówek – to jak to przenieść?
oto szkic skryptu, który potrafi zaciągnąć plik z ADADCLscan i przenieść do innej domeny. to, co trzeba zrobić przed jego użyciem to:
- zmienić w pliku raportu nazwę domeny źródłowej na docelową we wszystkich rekordach
- wyciąć przedrostki z nazw grup [np. DOMAIN\mygroup -> mygroup]
param(
[parameter(ParameterSetName="FILE",Mandatory=$true,Position=0)][string]$fileName
)
import-module ActiveDirectory
$AD_ACLS=import-csv $fileName -delimiter ';' -header "OU","Trustee","Right","inheritance","objectTypeGUID","InheritedObjectTypeGUID","objectACEFlags","AccessControlType","isInherited","inheritanceFlag","propagationFlags"
foreach($ACLentry in $AD_ACLS) {
$grpSID=new-object System.Security.Principal.SecurityIdentifier (get-adgroup $ACLentry.trustee).SID
$objTypeGUID=New-Object guid $ACLentry.objectTypeGUID
$inheritedOTGUID=New-Object guid $ACLentry.InheritedObjectTypeGUID
$ace=New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
$grpSID,
$ACLentry.right,
$ACLentry.AccessControlType,
$objTypeGUID,
$ACLentry.inheritance,
$inheritedOTGUID
)
$acl=get-acl AD:$($ACLentry.OU)
$acl.AddAccessRule($ace)
set-acl -AclObject $acl AD:$($ACLentry.OU)
}
skrypt jest bardzo prymitywny – np. zakłada, że uprawnienia są tylko dla grup a nie dla użytkowników czy komputerów, nie ma obsługi błędów, etc – niemniej pokazuje kilka ważnych elementów: jak wygląda pełny nagłówek, w jaki sposób korzysta się z cmdletów ACL.
eN.

