andreas65m
Goto Top

ACL kopierter Verzeichnisse vergleichen

Hallo,

ich muss gerade ganze Verzeichnisse von einem Laufwerk zum anderen kopieren und dabei alle Berechtigungen beibehalten.

Ich habe die Kopie per robocopy gemacht

set day=%date:~0,2%
robocopy e:\ f:\ *.* /MIR /COPY:datso /Z /mt:4 /r:0 /w:0 /NP /log:mv%day%.log /lev:1 /XD "E:\DWDocuments-old"

wollte aber nun sicherheitshalber kontrollieren.
Ich habe mir daher folgenden Skript erstellt

$acl_e=""
$acl_f=""

Get-ChildItem –Path "E:\dwfolders\" –Recurse |
Foreach-Object {
$pfad=$_.fullname
$acl_e=get-acl $pfad | select Owner,group, access, Audit, Sddl

$pfad ='F'+ $pfad.substring(1,$pfad.length-1)

$acl_f=get-acl $pfad | select Owner,group, access, Audit, Sddl

if (($acl_e -ne $acl_f) )
{
write-host $pfad
write-host $acl_e
write-host $acl_f
break
}
}

$acl_e scheint aber immer ungleich $acl_f zu sein, obwohl die ausgegebenen Strings identisch aussehen

@{Owner=VORDEFINIERT\Administratoren; Group=WOBI\Domänen-Benutzer; Access=System.Security.AccessControl.AuthorizationRuleCollection; Audit=; Sddl=O:BAG:DUD:AI(A;;FA
;;;BA)(A;ID;FA;;;BA)(A;OICIIOID;GA;;;BA)(A;ID;FA;;;SY)(A;OICIIOID;GA;;;SY)(A;ID;0x1301bf;;;AU)(A;OICIIOID;SDGXGWGR;;;AU)(A;ID;0x1200a9;;;BU)(A;OICIIOID;GXGR;;;BU)}
@{Owner=VORDEFINIERT\Administratoren; Group=WOBI\Domänen-Benutzer; Access=System.Security.AccessControl.AuthorizationRuleCollection; Audit=; Sddl=O:BAG:DUD:AI(A;;FA
;;;BA)(A;ID;FA;;;BA)(A;OICIIOID;GA;;;BA)(A;ID;FA;;;SY)(A;OICIIOID;GA;;;SY)(A;ID;0x1301bf;;;AU)(A;OICIIOID;SDGXGWGR;;;AU)(A;ID;0x1200a9;;;BU)(A;OICIIOID;GXGR;;;BU)}

Ich habe die zwei Zeilen auch online verglichen, finde aber keinen Unterschied.

Kann mir bitte jemand sagen, was ich hier falsch mache?

Danke
Andeas

Content-ID: 7591743799

Url: https://administrator.de/contentid/7591743799

Ausgedruckt am: 17.11.2024 um 17:11 Uhr

emeriks
Lösung emeriks 20.06.2023 um 11:02:12 Uhr
Goto Top
Hi,
am Rande: Nutze bitte Code-Tags!

$acl_e und $acl_f sind Objekte, und solche kann man nicht einfach mit "ist gleich" vergleichen.

Du musst die Eigenschaften der Objekte (Owner,group, access, Audit, Sddl) einzeln vergleichen.

E.
andreas65m
andreas65m 20.06.2023 um 14:27:26 Uhr
Goto Top
Zitat von @emeriks:

Hi,
am Rande: Nutze bitte Code-Tags!

$acl_e und $acl_f sind Objekte, und solche kann man nicht einfach mit "ist gleich" vergleichen.

Du musst die Eigenschaften der Objekte (Owner,group, access, Audit, Sddl) einzeln vergleichen.

E.

Hallo Emeriks,

vielen Dank für den Hinweis. Nun vergleiche ich jeweils Owner, group, Audit und sddl.
Wenn ich auch access vergleiche, dann habe ich wieder dasselbe Problem, dass dies wohl auch wieder ein Objekt ist.
Da muss ich dann wohl noch tiefer gehen.

Auf jeden Fall vielen Dank
Andreas
emeriks
emeriks 20.06.2023 aktualisiert um 14:55:28 Uhr
Goto Top
Was kommt raus bei ... ?

$acl_e.ToString()
$acl_f.ToString()

Vielleicht kann man einfach diese vergleichen?

if ($acl_e.ToString() -ne $acl_f.ToString() ) {
...
}


Edit:
Ich sehe gerade ...
Wenn Du SDDL dabei hast, dann reicht es doch, wenn Du dieses vergleichst?

$Quelle = $_.fullname
$Ziel ='F'+ $Quelle.substring(1,$Quelle.length-1)  

If( (get-acl $Quelle).SDDL -ne (get-acl $Ziel).SDDL) ) {
...
}
Dani
Lösung Dani 21.06.2023 um 19:35:17 Uhr
Goto Top
Moin,
ich muss gerade ganze Verzeichnisse von einem Laufwerk zum anderen kopieren und dabei alle Berechtigungen beibehalten.
Ist es ein und das selbe Laufwerk oder sind das zwei verschiedene Laufwerke? Weil ist es ein das selbe Laufwerk (z.B. D:\ ) so kann das Standardverhalten von Windows per Registry angepasst werden. Wenn es zwei verschiedene Laufwerke sind, sollte die ACL des Zielverzeichnisses übernommen werden.


Gruß,
Dani