Auswerten aktueller ACEs in NTFS-ACLs mit PowerShell

7

Wir haben ein Dokumentenverwaltungssystem, das Millionen von Dateien in einem NTFS-Dateisystem enthält, auf das über eine Netzwerkfreigabe zugegriffen wird. Ein einzelnes Dienstkonto benötigt die vollständige Berechtigung für alle diese Dateien, und die Anwendungsbroker greifen über dieses Dienstkonto zu.

Während einer Datenmigration ist etwas passiert und die Berechtigungen sind jetzt inkonsistent.

Ich habe versucht, ein Skript in PowerShell zu schreiben, um festzustellen, welche Dateien nicht über die entsprechende ACE verfügen, aber es get-aclist etwas ... schmerzhaft.

Ich habe verschiedene Kombinationen ausprobiert, ähnlich:

get-childitem -recurse | get-acl | select -expandproperty access | 
where { $_.$_.IdentityReference -notcontains $principal

Dabei ist $ Principal der Benutzer, der eine Berechtigung im domain\userFormat benötigt.

Es muss einen Weg geben, das zu tun, oder? Was ist es? Ich möchte es in PowerShell nativ behalten und nicht verwenden icaclsoder caclswenn möglich.

MDMarra
quelle
Was Sie versuchen zu tun, ist unklar: Was meinen Sie genau mit "inkonsistent" und was ist das Endergebnis, das Sie erhalten möchten? Warum möchten Sie keine externen Tools verwenden, wenn diese die Arbeit erledigen?
Stephane
Was ist unklar? Ein Konto benötigt die volle Kontrolle über alle Dateien auf der Freigabe. Dieses eine Konto hat nicht die volle Kontrolle über alle Dateien auf der Freigabe. Die LOB-Anwendung unterbricht die Vererbung an vielen Stellen, sodass explizite ACEs verwendet werden müssen.
MDMarra
1
Es ist unklar, in welchem ​​Zustand Sie sich gerade befinden, was Sie unter "inkonsistent" verstehen und was genau Sie benötigen. Ironischerweise hat Ihr Kommentar dem, was Sie wollen, eine (wichtige) Genauigkeit hinzugefügt.
Stephane
Richtig, mit "inkonsistent" meine ich, dass einige Ingenieure von EMC einen Prozess verwendet haben, mit dem ich nicht vertraut bin, um Daten zwischen CIFS-Freigaben zu mischen, und jetzt sind diese Dienstkonten nicht in den ACEs jeder ACL auf dem Volume aufgeführt, was sie sollten Sein. Hoffe das klärt.
MDMarra
Ein Teil des Problems mit "inkonsistent" ist, dass ich zu diesem Zeitpunkt noch nicht einmal weiß, was es bedeutet, und dass der Datensatz so umfangreich ist, dass er sich nicht für eine manuelle Überprüfung eignet.
MDMarra

Antworten:

8

Sie könnten es so machen (das Aufteilen in weitere Anweisungen hilft der Lesbarkeit):

# Go to the directory and find the files
Push-Location "C:\MDMarrasFiles"
$Files = Get-ChildItem -Recurse

# Create an IdentityReference and a FullControl FileSystemAccessRule for said identity
$Principal = New-Object System.Security.Principal.NTAccount("DOMAIN\user")
$FullControlACERule = New-Object System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($Principal,"FullControl","Allow")

# Go through the files
foreach($File in $Files)
{
    # Get the current ACL on the file
    $ACL = Get-ACL $File

    # Extract the ACEs, both explicit on the file and inherited 
    $ACEs = $ACL.GetAccessRules($true,$true,[System.Security.Principal.NTAccount])

    # Filter the ACEs to extract those giving FullControl to your target user
    $ACEsMatching = $ACEs |Where {`
        $_.FileSystemRights -eq "FullControl" -and `
        $_.IdentityReference -eq $objUser -and `
        $_.AccessControlType -eq "Allow"` 
    }

    # Test if there where no such ACE to be found
    if($ACEsMatching.Count -eq 0)
    {
        # Add the FullControl Rule to the current ACL
        $ACL.AddAccessRule($FullControlACERule)

        # Write the new ACL back to the file
        Set-ACL $File -AclObject $ACL 
    }
}
Pop-Location

Bitte testen Sie dies an einer kleineren Teilmenge von Dateien, bevor Sie in der Produktion laufen ;-)

Wenn Sie sicherstellen möchten, dass ein neuer expliziter ACE hinzugefügt wird, obwohl das Konto möglicherweise bereits über das geerbte Recht verfügt, filtern Sie geerbte Zugriffsregeln wie folgt heraus:

$ACEs = $ACL.GetAccessRules($true, $false ,[System.Security.Principal.NTAccount])

Beachten Sie, dass das zweite boolesche Argument jetzt $falseangibt, dass geerbte Regeln nicht zurückgegeben werden sollen

Mathias R. Jessen
quelle