Hallo,
ich folgendes Problem welches ich nicht aufgelöst bekomme:
Viele Ordner auf einem FileServer unter Windows Server 2012 enthalten doppelte NTFS Berechtigungen, in der Powershell sieht das so aus:
$a = get-acl .\Ordner $a.access FileSystemRights : Modify, Synchronize AccessControlType : Allow IdentityReference : Domain\Gruppe IsInherited : False InheritanceFlags : ContainerInherit, ObjectInherit PropagationFlags : None FileSystemRights : Modify, Synchronize AccessControlType : Allow IdentityReference : Domain\Gruppe IsInherited : False InheritanceFlags : ContainerInherit, ObjectInherit PropagationFlags : None FileSystemRights : Modify, Synchronize AccessControlType : Allow IdentityReference : Domain\Benutzer IsInherited : False InheritanceFlags : ContainerInherit, ObjectInherit PropagationFlags : None
Wie man sieht taucht die Gruppe 2 mal mit den identischen Berechtigungen auf. ich habe nun angefangen ein Script zu erstellen, welches aber nicht funktionieren will und ich erkenne den/die Fehler nicht:
Ausnahme beim Aufrufen von "RemoveAccessRule" mit 1 Argument(en): "Der Wert darf nicht NULL sein. Parametername: rule" In D:\correct_doublepermissions.ps1:43 Zeichen:2+ $fileacl.RemoveAccessRule($saveacl)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException+ FullyQualifiedErrorId : ArgumentNullException Ausnahme beim Aufrufen von "AddAccessRule" mit 1 Argument(en): "Der Wert darf nicht NULL sein. Parametername: rule" In D:\correct_doublepermissions.ps1:44 Zeichen:2+ $fileacl.AddAccessRule($saveacl)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException+ FullyQualifiedErrorId : ArgumentNullException Das Argument "identity" mit dem Wert "VORDEFINIERT\Administratoren" für "SetOwner" kann nicht in den Typ"System.Security.Principal.IdentityReference" konvertiert werden: "Der Wert "VORDEFINIERT\Administratoren" vom Typ"System.String" kann nicht in den Typ "System.Security.Principal.IdentityReference" konvertiert werden." In D:\correct_doublepermissions.ps1:49 Zeichen:2+ $fileacl.SetOwner($fileowner)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo : NotSpecified: (:) [], MethodException+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
Kann mir jemand auf die Sprünge helfen?
Das Script sieht so aus:
$tmpowner = New-Object System.Security.Principal.NTAccount('VORDEFINIERT\Administratoren') $files = Get-ChildItem -Recurse | where {$_.PSIsContainer -eq "True"} | foreach -Process {$_.Fullname} foreach ($file in $files) { #Neue ACL einlesen und nach doppelten Gruppen suchen $fileacl = get-acl $file $fileaccessgroups = $fileacl.access.IdentityReference $diff = $fileaccessgroups | select -Unique $doubleentries = compare-object -ReferenceObject $fileaccessgroups -DifferenceObject $diff if ($doubleentries) { foreach ($doubleentry in $doubleentries) { $doubleentry = $doubleentry.InputObject $doubleentry = $doubleentry.Value $doubleentry = $doubleentry.Replace("\","\\") #Doppelte Eintraege in ACL entfernen $saveacl = $fileacl.access | where {$_.IdentityReference -match "$doubleentry" -and $_.IsInherited -match "False"} | select -last 1 if ($saveacl) { Temp Owner setzen damit Powershell die ACL aendern kann $fileacl = get-acl $file $fileowner = $fileacl.Owner #fileacl.SetOwner($tmpowner) #Set-Acl -AclObject $fileacl -Path $file $null = $fileacl.RemoveAccessRule($saveacl) $fileacl.AddAccessRule($saveacl) Set-Acl -AclObject $fileacl -Path $file #Urspruenglichen Owner wieder setzen $fileacl = get-acl $file $fileacl.SetOwner($fileowner) Set-Acl -AclObject $fileacl -Path $file } } } }
Vielen Dank im Voraus und ein schönes Wochenende
Frank