Stefan W 14 Geschrieben 3. Januar 2013 Melden Teilen Geschrieben 3. Januar 2013 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? Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 6. Januar 2013 Melden Teilen Geschrieben 6. Januar 2013 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" } 1 Zitieren Link zu diesem Kommentar
Stefan W 14 Geschrieben 7. Januar 2013 Autor Melden Teilen Geschrieben 7. Januar 2013 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 Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 7. Januar 2013 Melden Teilen Geschrieben 7. Januar 2013 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 1 Zitieren Link zu diesem Kommentar
Stefan W 14 Geschrieben 7. Januar 2013 Autor Melden Teilen Geschrieben 7. Januar 2013 Wow, danke ;) damit werde ich mich morgen auseinandersetzen Zitieren Link zu diesem Kommentar
Hippo 11 Geschrieben 9. Januar 2013 Melden Teilen Geschrieben 9. Januar 2013 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? Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 9. Januar 2013 Melden Teilen Geschrieben 9. Januar 2013 (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 9. Januar 2013 von Dukel Zitieren Link zu diesem Kommentar
Hippo 11 Geschrieben 11. Januar 2013 Melden Teilen Geschrieben 11. Januar 2013 Ok, das habe ich übersehen, aber jetzt gemacht. Nun gibt es keine Fehlernmeldung mehr, die Ausgabedateien werden angelegt, nur leider sind die .csv Dateien leer? Gibt es hier noch so eine einfache Lösung? Zitieren Link zu diesem Kommentar
Stefan W 14 Geschrieben 12. Januar 2013 Autor Melden Teilen Geschrieben 12. Januar 2013 Hast du das Script mit erhöhten Rechten ausgeführt? Da er die CSV auf C:\temp schreibt, könnte das helfen (existiert der Ordner?;)) lg Zitieren Link zu diesem Kommentar
Hippo 11 Geschrieben 14. Januar 2013 Melden Teilen Geschrieben 14. Januar 2013 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 :-( Zitieren Link zu diesem Kommentar
Stefan W 14 Geschrieben 14. Januar 2013 Autor Melden Teilen Geschrieben 14. Januar 2013 Manchmal sieht man den Wald vor lauter Bäumen nicht ;) Geht mir ab und zu genauso ;) Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.