2017-08-25 215 views
1

我想獲得像下面的CSV輸出,以便用戶可以在Excel中篩選。Powershell:獲取目錄權限遞歸

文件夾,組,權限 I:\ Folder1中,CORP \ 1組,READDATA,ExecuteFile,同步 I:\ Folder1中\文件夾2,CORP \第2組,READDATA,ExecuteFile,同步

下面是什麼啓動用。非常低效,並且不提供所需的CSV輸出。將感謝任何幫助。

$output_file = $(get-date -f MM-dd-yyyy_HH_mm_ss)+'.txt' 
"{0},{1},{2}" -f "Folder","Groups","Permissions"| add-content -path $output_file 


$file_content = '' 

function GetFolders($path = $pwd) 
{ 
    if($path -ne $null) { 
     $new_row = Get-ACL $path | select -ExpandProperty Access | Where-Object IdentityReference -Like "CORP*" | SELECT $path, IdentityReference, FileSystemRights | Format-Table -HideTableHeaders | Out-String 
     $fileContent += $new_row 
     $fileContent | add-content -path $output_file 

     foreach ($item in Get-ChildItem $path) 
     { 
      if (Test-Path $item.FullName -PathType Container) 
      { 
       Write-Output $item.FullName 
       GetFolders $item.FullName 
       $new_row = Get-ACL $item.FullName | select -ExpandProperty Access | Where-Object IdentityReference -Like "CORP*" | SELECT $item.FullName, IdentityReference, FileSystemRights | Format-Table -HideTableHeaders | Out-String 
       $fileContent += $new_row 
       $fileContent | add-content -path $output_file 
      } 
     } 
    } 
} 


GetFolders "J:\" 

回答

1

你在正確的道路上,但有點偏離課程。

Set-Content -Path $FileName -Value 'Folder,Groups,Permissions' 

(Get-Acl -Path $Path).Access | 
    Where-Object -Property IdentityReference -like 'corp*' | 
    ForEach-Object { 
     Add-Content -Path $FileName -Value "$Path,$($_.IdentityReference),$($_.FileSystemRights -replace '\s')" 
    } 

要倒過來的(如果你要編輯的子表達式的代碼或性質的東西)

$Val = {"$Path,$($_.IdentityReference),$($_.FileSystemRights -replace '\s')"} 
... -Value (&$Val) ... 
+0

爲什麼你使用'我不明白Add-Content'而不是'Export-Csv' – Clijsters

+0

兩者都是有效的,但如果數據已經形成,那麼'Add-Content'的開銷就會小一些。 @Clijsters – TheIncorrigible1

+0

當然,但它也比較慢,不是嗎?我認爲這取決於硬件,但是在每一次迭代中打開和關閉流聽起來很沉重。但是,是一個非常清晰和簡單的代碼示例中較少的開銷結果。 – Clijsters