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






