Jump to content

Berechtigungs(Miss)Konfiguration Anzeigen Powershell


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Grüß euch,

Nachdem die Dokumentation meiner Vorgänger etwas zu Wünschen übrig gelassen hat, und ich bemerkt habe, dass teilweise auf Zuruf Berechtigungen auf Dateiebene (oder dem 25ten Unterordner) erstellt wurden, würde ich mir gerne anzeigen lassen, welche Berechtigungen welcher Ordner/Datei hat.

 

Angefangen habe ich hiermit.

$DirPath = "\\Server\d$\shares\share"
$DirInfo = New-Object System.IO.DirectoryInfo($DirPath)
$DirSec= Get-ACL $DirPath 

$headline= "{0,-50} {1,-90} {2,-10} " -f `
   "`nIdentität","Berechtigungen","Vererbt"
   
Write-Host -BackgroundColor Yellow -ForegroundColor Red"$DirPath"
Write-Host -BackgroundColor Yellow -foregroundcolor Red "$headline`n"

$ACL=$DirSec.Access
$ACL=$ACL | sort
$ACL | foreach{
   $Identity=$_.IdentityReference
   $FileSystemRights=$_.FileSystemRights
   $IsInherited=$_.IsInherited
   
   "{0,-50} {1,-90} {2,-10}" -f `
        $Identity,$FileSystemRights,$IsInherited   
}

Isinherit möchte ich mir anzeigen lassen, um es später herauszufiltern, und mir nur noch die Dateien und Ordner anzeigen zu lassen, die nicht-vererbte Berechtigungen aufweisen.

 

2 Punkte behindern mich derweilen noch.

 

1.) Möchte ich auch Unterordner überprüfen (ich habe an foreach gedacht, da get-childitem keine Pfade zurückgibt hänge ich)

2.) oben beschriebenes Filtern sollte doch möglich sein - meinereiner weiß jedoch nicht wie ;)

 

Hat jemand dazu ideen?

 

Geschrieben

1.) Möchte ich auch Unterordner überprüfen (ich habe an foreach gedacht, da get-childitem keine Pfade zurückgibt hänge ich)

2.) oben beschriebenes Filtern sollte doch möglich sein - meinereiner weiß jedoch nicht wie ;)

 

Hi,

Zu 1) Man kann gci auch dazu überreden, die Pfade auszuspucken

 

 

$Path= "c:\temp"
Get-ChildItem $path -Recurse | foreach{
 If($_.PSIsContainer -eq $True){
   $_.fullname
   #$_.PsParentPath
   #$_.PschildName
   }
 }

 

 

Ab PS3 kannst du den if-Block weglassen, und get-childitem den Positionsparameter -Directory mitgeben

 

zu 2.)

IsInherited hat entweder $true oder $false. Auf diese Werte kannst du doch filtern

 

$a=4 -le 2
$a
if($a -eq $false){
   "Falsch"
   }else{
   "Richtig"
   }
Geschrieben

Hi Blub,

danke für die Hilfe

 

Punkt 1

danke,hat super funktioniert - habs etwas abgeändert, da mich auch Berechtigungen auf Dateien direkt interessieren, die abgeändert wurden

Zu Punkt 2

Man sieht den Wald vor lauter Bäumen nicht ;) Danke

 

 

Um anderen eventuell etwas Arbeit abzunehmen

vorerst lauffähiges Script - falls es jemand benötigt

$Path= Read-Host "Bitte FQDN des gewünschten Zielordners eingeben.(\\Server\freigabe)"
Get-ChildItem $Path -Recurse | foreach{
   $Childpath= $_.fullname
   $ChildPath | foreach{
        $PathInfo = New-Object System.IO.DirectoryInfo($ChildPath)
        $PathSec= Get-ACL $ChildPath
        $ACL=$PathSec.Access
        $ACL=$ACL | sort
            $ACL | foreach{
            $Identity=$_.IdentityReference
            $FileSystemRights=$_.FileSystemRights
            $IsInherited=$_.IsInherited
                if ($IsInherited -eq $false)
                {
                $headline= "{0,-50} {1,-90} {2,-10} " -f `
                "Identität","Berechtigungen","Vererbt"
                Write-Host -BackgroundColor red -foregroundcolor green "$Childpath"
                Write-Host -BackgroundColor red -foregroundcolor green "$headline"
                "{0,-50} {1,-90} {2,-10}`n`n" -f `
                $Identity,$FileSystemRights,$IsInherited
                }
                    else
                    {
                    }
            
        }
    }
}

 

Die Ausgabe sieht zum Beispiel so aus

\\Server\Freigabe\Datei.zip
Identität                              Berechtigungen                                                                 Vererbt    
Domäne\User123                         FullControl                                                                    False     


\\Server\Freigabe\Ordner
Identität                              Berechtigungen                                                                 Vererbt    
Domäne\123User                         FullControl                                                                    False     

Ich hätte das gerne in einer Datei.

Wenn ich jedoch das ganze Script pipe, dann hab ich die oben beschriebenen Write-host und somit die Headlines und die Zuordnungen nicht in der Datei drinnen.

gibt es dafür auch noch so einen netten Wink? :)

lg

Stefan

Geschrieben

Ich habe dein Skript etwas angepasst. Als Datenstruktur benutze ich eine Datatable, damit kannst du die Ausgabe jenach Wunsch an Format-Table oder export-csv übergeben

 

 

Set-StrictMode -Version "2.0"
Clear-Host
$Path= # Read-Host "Bitte FQDN des gewünschten Zielordners eingeben.(\\Server\freigabe)"

#DataTable anlegen
$Properties = @("Ordnername","Identitaet","Berechtigungen","Vererbt")
$DataTable=New-Object System.Data.DataTable("FileACL")
$Properties | foreach {
  $Column = New-Object System.Data.DataColumn($_)
  $DataTable.Columns.Add($Column)
 }

#DataTable befüllen
Get-ChildItem $Path -Recurse | foreach{
   $FolderName = $_.Name
   
   $ACLs= @((Get-ACL $_.FullName).Access) | sort
   $ACLs | foreach{
      $Identity=$_.IdentityReference
      $FileSystemRights=$_.FileSystemRights
      $IsInherited=$_.IsInherited
      $DataTable.Rows.Add($FolderName,$Identity,$FileSystemRights,$IsInherited) | Out-Null
    }
             
}
#Datatable Filtern
$Filter = "(Vererbt like 'False')"
$FilteredDataTable = $DataTable.Select($Filter,$null)

#DataTable ausgeben
$FilteredDataTable | Format-Table OrdnerName,Identitaet,Berechtigungen,Vererbt -auto      #Host
$FilteredDataTable | Export-Csv "c:\temp\ausgabe1.csv" -Delimiter ";" #File
$FilteredDataTable | select Ordnername,Vererbt | Export-Csv "c:\temp\ausgabe2.csv" -Delimiter ";" #File
 
Geschrieben

Hallo,

 

ich habe gerade an einen Windows Server 2008 das Script ausprobiert. Leider ohne Erfolg.

 

Das Script fragt nicht welche Freigabe er dokumentieren soll.

Die Ausgabe Dateien werden angelegt, doch sind sie leer.

 

Es erscheint folgender Fehler (4 *"Ordnername","Identitaet","Berechtigungen","Vererbt"):

 

Get-ChildItem : Der Pfad "C:\temp\Ordnername" kann nicht gefunden werden, da er nicht vorhanden ist.
Bei C:\temp\ntfs.ps1:14 Zeichen:14
+ Get-ChildItem <<<<  $Path -Recurse | foreach{
    + CategoryInfo          : ObjectNotFound: (C:\temp\Ordnername:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

 

Muss das Script mit einen Parameter gestartet werden?

Geschrieben (bearbeitet)

Entferne bei

$Path= # Read-Host "Bitte FQDN des gewünschten Zielordners eingeben.(\\Server\freigabe)"
das Kommentarzeichen.

 

Wenn du immer ein Share überwachen willst kannst du den Pfad direkt ins Script schreiben, statt dem Read-Host.

bearbeitet von Dukel
Geschrieben

Es geht doch, wenn man es richtig macht.

Zum Testen habe ich extra eine Ordnerstruktur mit unterbrochener Vererbung angelegt (dachte ich). Das Script lief zwar durch, die csv-Dateien wurden angelegt aber sie waren leer. Der Fehler lag darin, das die Vererbung doch nicht unterbrochen war und das es nichts zu protokollieren gab :-(

Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...