hainsane
Goto Top

Powershellscript NTFS Berechtigungen - Gruppen aufschlüsseln

Hallo zusammen,

ich habe den Auftrag von unserer HR Abteilung bekommen alle NTFS Berechtigungen auf dem Laufwerk aufzuschlüsseln. Und zwar nach konkreten Personen.

Ich habe bereitsfolgendes Script in der Suche gefunden, war allerdings nicht in der Lage dieses entsprechend anzupassen, dass er mir die Gruppen auflöst.

Ich weiß, dass ich mit get-adgroupmember die Mitglieder rausbekomme, aber ich bin überfordert das passend in das vorhandene Script zu integrieren.


Genauso habe ich festgestellt, dass wir einige Ordner mit über 256 Zeichen haben, die das Script nicht verarbeiten konnte. In der Powershell sind die natürlich mit entsprechenden Fehlermeldungen angezeigt, aber kann ich die mit irgend einem Befehl noch in eine Datei schreiben, damit wir die Pfade entsprechend korrigieren können? Ich habe dazu zwar auch ein Script hier entdeckt, dass die Ordner Icons ändern, aber das wurde abgelehnt. Wir sollen die Abteilungen informieren, die betroffen sind.

Viele Grüße

Content-ID: 605006

Url: https://administrator.de/forum/powershellscript-ntfs-berechtigungen-gruppen-aufschluesseln-605006.html

Ausgedruckt am: 26.12.2024 um 11:12 Uhr

chkdsk
chkdsk 16.09.2020 um 11:54:47 Uhr
Goto Top
Hi,

Du möchtest einen Fileserver auf NTFS Zugriffsberechtigungen überprüfen? Ich möchte nur mal darauf hinweisen, dass das ewig dauern kann!
Es muss jeder Ordner angefasst werden. Wo willst du das Skript denn überhaupt laufen lassen?

Grüße
chkdsk
chkdsk 16.09.2020 um 12:21:03 Uhr
Goto Top
Falls du die Ordner etwas eingrenzen kannst, kannst du folgendes Skript probieren.
Es listet dir den gewählten Ordner inkl. aller Unterordner auf und gibt dir aus, wer was darf.
Ich betone noch mal....Je höher die Ordnerstruktur auf dem Fileserver, desto länger dauert es.

$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('MM-dd-yyyy')  

Function Get-Folder($initialDirectory)

{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null  

    $Ordnername = New-Object System.Windows.Forms.FolderBrowserDialog
    $Ordnername.Description = "Ordner auswählen"  
    $Ordnername.rootfolder = "MyComputer"  

    if($Ordnername.ShowDialog() -eq "OK")  
    {
        $Ordner += $Ordnername.SelectedPath
    }
    return $Ordner
}

$folder = Get-Folder
Write-Host
Write-Host
Write-Host "Berechtigungsstruktur wird gelesen"  
Write-Host "Liste wird erstellt. Bitte warten..."  

Get-ChildItem –Path $folder –Recurse -Directory | Get-NTFSAccess |  ?{$_.Account.Sid -notin @('S-1-5-18','S-1-5-32-544')} | select Fullname,Account,AccessRights,InheritedFrom | export-csv -Path "$env:USERPROFILE\Desktop\Berechtigungsstruktur_$CurrentDate.csv" -NoType -Encoding UTF8 -Delimiter ";"   
HAinsane
HAinsane 16.09.2020 um 13:13:00 Uhr
Goto Top
Vielen Dank für dein Script.
Vom Prinzip her suche ich genau sowas. Allerdings ist das verklinkte Script etwas schöner was die Ausgabe betrifft.
Mein Problem ist aber immer nocht, dass beide Varianten die Berechtigungsgruppen ausgeben, was an sich korrekt ist.

Allerdings müsste ich jetzt von Hand noch die User zu den entsprechenden Gruppen schreiben. Ich habe gehofft, dass irgendwie automatisiert ins Script einzubauen.

Dass er mir z.B. im Array den Wert für die Gruppe nimmt, an get-adgroupmember weiterreicht, dass mir anschießend die Berechtigten Personen für den Ordner nennt und nicht nur die Berechtigungsgruppe.
chkdsk
chkdsk 16.09.2020 um 13:57:49 Uhr
Goto Top
Du kannst mein Skript aber dahingehend anpassen, das er dir in der Excel Liste nur den/die gewünschten User anzeigt
chkdsk
chkdsk 16.09.2020 um 14:41:55 Uhr
Goto Top
Ansonsten probiere folgendes.
Du startest das Skript, gibst den gewünschten Usernamen ein, wählst den gewünschten Oberordner (Auch hier, je höher gewählt desto länger läuft es!!!) und du erhältst im Anschluss alle Ordner, auf die der angegebene User Zugriff hat. Inkl. der Rechte die er auf den Ordner hat.
$User = read-Host "Gebe User ein: "  

Function Get-Folder($initialDirectory)
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null  
    $Ordnername = New-Object System.Windows.Forms.FolderBrowserDialog
    $Ordnername.Description = "Ordner auswählen"  
    $Ordnername.rootfolder = "MyComputer"  
    if($Ordnername.ShowDialog() -eq "OK")  
    {
        $Ordner += $Ordnername.SelectedPath
    }
    return $Ordner
}
$o = Get-Folder
write-host
write-host "Das kann eine Weile dauern. Bitte warten..."  
write-host

function Get-FolderRightsForAccount([string]$dn, [string]$rootfolder, [switch]$includeInheritedRights){
    $sids = @()
    $sids += (Get-ADObject $dn -Properties objectSid).objectSid.Value
    $sids += Get-ADPrincipalGroupMembership $dn | select -Expand GroupName
    $inherited = @{$true=($true,$false);$false=$false}[$includeInheritedRights.IsPresent]
    (Get-ACL $rootfolder).Access | ?{try{$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -in $sids -and $_.IsInherited -in $inherited}catch{}} | select @{n='Folder';e={$rootfolder}},AccessControlType,@{n='Rights';e={$_.FileSystemRights}}  
    gci $rootfolder -Recurse -Directory -PipelineVariable f | %{
        (Get-ACL $_.Fullname).Access | ?{try{$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -in $sids -and $_.IsInherited -in $inherited}catch{}} | select @{n='Folder';e={$f.Fullname}},AccessControlType,@{n='Rights';e={$_.FileSystemRights}}  
    }
}

Get-FolderRightsForAccount -dn (Get-ADUser $User).DistinguishedName -rootfolder $o -includeInheritedRights | ft -AutoSize 
write-host
read-host "Zum Beenden beliebige Taste druecken"  
HAinsane
HAinsane 24.09.2020 um 17:48:30 Uhr
Goto Top
Guten Abend chkdsk,

super Skript und danke für die Anpassung, aber leider bräuchte ich das ja anders herum. So müsste ich alle 800 User einzeln abfragen und diese dauern dann pro Abfrage wahrscheinlich ewig. Ich mein die User an ein Array zu übergeben und das Array anschleißend abzuarbeiten macht auch keinen Sinn oder?
chkdsk
chkdsk 25.09.2020 um 07:31:25 Uhr
Goto Top
Du sollst also von allen Personen in deinem Unternehmen aufschlüsseln, auf welche Ordner diese Zugriff haben? <800 Mitarbeiter?
HAinsane
HAinsane 25.09.2020 um 09:52:34 Uhr
Goto Top
Ja genau! Wir haben ein Fileserver und dort würde ich gerne durchgehen. Wie oben verlinkt gibt mir das Skript schon die passenden Gruppen aus, die die Ordnerberechtigungen haben. Allerdings müsste ich jetzt jede Gruppe händisch auflösen und würde das gerne irgendwie mit automatisieren.
chkdsk
chkdsk 25.09.2020 aktualisiert um 15:23:43 Uhr
Goto Top
Dann nimm doch das von mir gepostete Skript und lass dir das Ergebnis als .csv Datei ausgeben. Dann einfach innerhalb der .csv Datei einen Filter setzen, meinetwegen A-Z und schon hast du alle Ordner+Unterordner sortiert nach User.