2016-06-30 15 views
1

Ich erhalte rekursiv eine Liste von Ordnern mit ihren jeweiligen Berechtigungen in einem Powershell-Skript, aber wenn der rekursive Teil geschieht mein Ausgabe-String druckt die Ordnerstruktur jedes Mal ein Beispiel dafür ist:Abrufen von Ordnern und Berechtigungen in Powershell

Ich habe einen Ordner namens C: \ temp, in diesem Ordner befinden sich 2 leere Ordner C: \ temp \ folder1 und C: \ temp \ folder2. Mit meinem Skript wäre die Ausgabe:

Ich habe zur besseren Lesbarkeit der Berechtigungen weggelassen

C:\temp 
C:\temp\folder1 
C:\temp 
C:\temp\folder2 

Ich will das nicht passieren soll ich eine Liste von Ordnern mit ihren Berechtigungen und dann, wenn die Berechtigungen für einen untergeordneten Ordner sind unterschiedlich, dann schauen Sie sich die untergeordneten Ordner dieses Ordners an. Dies funktioniert abgesehen von der Saitenbildung, bei der ich denke, dass ich ein frisches Paar Augen brauche, um es anzuschauen, weil ich nirgendwohin komme.

Schätzen Sie die Hilfe im Voraus,

Sam

Code:

Add-Type -AssemblyName System.Windows.Forms 
Import-Module ActiveDirectory 
$info = "" 
$OutputString 
$step = 0 
function DisplayForm{ 

#Some GUI code 
#$textBox takes in the base folder from the user 

    if ($result -eq [System.Windows.Forms.DialogResult]::OK) 
    { 
     $baseFolder = $textBox.Text 

     $ParentProperties = (Get-Acl $baseFolder).Access| Select-Object -ExpandProperty IdentityReference 
     $OutputString = $OutputString + $baseFolder + "`r`n" + $ParentProperties + "`r`n`r`n" 
     $ChildFolders = Get-ChildItem $baseFolder | where {$_.Attributes -eq 'Directory'} 

     FindPriorities($baseFolder) 


     $info = "SAVED TO FOLDER" 
     outputList 

    } 
} 

function FindPriorities{ 
    param($fileName) 
    $ChildFolders = Get-ChildItem $fileName | where {$_.Attributes -eq 'Directory'} 
    $step = $step + 1 
    $TempString = "" 
    foreach ($folder in $ChildFolders){ 
     $child = $fileName + "\\" + $folder.name 

    $ParentProperties = (Get-Acl $fileName).Access| Select-Object -ExpandProperty IdentityReference 
    $ChildProperties = (Get-Acl $child).Access| Select-Object -ExpandProperty IdentityReference 
    $parentString="" 

    foreach ($p in $ParentProperties){ 
     $parentString= $parentString + $p 
    } 
    $childString="" 
    foreach ($c in $childProperties){ 
     $childString = $childString + $c 
    } 

    if($childString -ne $parentString){ 
     $OutputString = $OutputString + $child + "`r`n" + $ChildProperties + "`r`n`r`n" 
     FindPriorities ($child) 
    }else{ 
     $OutputString = $OutputString + $child + "`r`n" + $ChildProperties + "`r`n`r`n" 
    } 

} 
} 

function outputList{ 
    $OutputString 

} 


DisplayForm 
+0

Sie den gleichen foreach-Code haben in 'DisplayForm', die in' FindPriorities' ist so sein alles zweimal laufen wird. ('foreach ($ Ordner in $ ChildFolders) {...}'). Am Ende der Funktion 'DisplayForm' rufen Sie' DisplayForm' erneut auf. – Richard

+0

Ja, das ist nur für die Unterordner im Basisordner. Wenn es einen hat, der andere Berechtigungen hat, geht es in den Ordner und findet die Unterordner –

+0

- -folder1 ----------- Ordner 2 (Gleiche Berechtigungen) ----------- Ordner 3 (Verschiedene Berechtigungen) ----------- --------------------------- Ordner 4 ...... und so weiter. Ich möchte immer, dass es zurückkommt und den Rest der Ordner im Basisordner durchsucht, deshalb habe ich es so –

Antwort

2

Ich glaube, ich verstanden, was Sie tun möchten.

Bitte geben Sie diesen Schnipsel einen Versuch:

function Get-IdentityReference($path) {  
    Get-Acl $path | 
     Select-Object -ExpandProperty Access | 
     Select-Object -ExpandProperty IdentityReference  
} 

function Extract-Permissions($baseFolder) { 
    $folders = Get-ChildItem $baseFolder | Where-Object { $_.PSisContainer } 
    $baseACL = Get-IdentityReference $baseFolder 

    "$baseFolder : $baseACL" 

    foreach($folder in $folders) { 
     $folderACL = Get-IdentityReference $folder.FullName 
     $childFolders = Get-ChildItem $folder.FullName | Where-Object { $_.PSisContainer } 

     "$($folder.FullName) : $folderACL" 

     foreach($childFolder in $childFolders) { 
      $childACL = Get-IdentityReference $childFolder.FullName 

      if(Compare-Object $childACL $folderACL) { 
       Extract-Permissions $childFolder.FullName 
      } else { 
       "$($childFolder.FullName) : $childACL" 
      } 
     } 
    } 
} 

$baseFolder = "$env:USERPROFILE\Desktop" 

Extract-Permissions $baseFolder 
+0

Dies scheint zu tun, was ich will, ich habe das 'Where-Objekt {$ _. PSisContainer}' in 'wo {$ _. Attribute -eq 'Verzeichnis'} 'weil es aus irgendeinem Grund den ersten Weg nicht zu mögen schien. Es gibt einen Fehler, von dem ich denke, dass einige Ordner keine Unterordner haben, aber sobald das sortiert ist, denke ich, dass das funktionieren wird! Vielen Dank. –

+0

Gern geschehen. Bitte lesen Sie dies: http: // stackoverflow.com/questions/3085295/how-do-ich-bekomme-nur-verzeichnisse-using-get-childitem. '$ _. Attribute -eq 'Directory' wird in vielen Fällen fehlschlagen, zum Beispiel bei schreibgeschützten Verzeichnissen. – sodawillow

+0

Ja, tut mir leid, ich dachte, das würde zuerst einen Fehler geben, aber jetzt habe ich es wieder geändert, es ist in Ordnung. Der Teil, der einen Fehler gab, war die Funktion Get-IdentityReference, also änderte ich in diesem Fall jede Zeile, in der der Aufruf erfolgte, in '(Get-Acl $ folder.FullName) .Access | Select-Object -ExpandProperty IdentityReference' Ich werde meine Frage mit dem Arbeitscode bearbeiten, wenn sie fertig ist, aber das ist die Antwort, die ich wählen werde. –

Verwandte Themen