2015-12-18 68 views
0

我遇到了一個我寫的腳本的問題。基本上,它從文件FolderList.txt中讀取UNC路徑列表。 從文件位置拉取ACL列表,並將所有信息導出到Excel。我的第一欄很好,但第二欄給我一個錯誤信息。我相信原因是我試圖將許多行數據或可能的數組類型數據放入第二列。請幫助我揮舞這個白旗。Powershell NTFS ACL導出到Excel錯誤

$ErrorActionPreference = "Stop" 

$Excel = new-Object -comobject Excel.Application 
$Excel.visible = $True 
$Excel = $Excel.Workbooks.Add() 
$Sheet = $Excel.Worksheets.Item(1) 
$Sheet.Cells.Item(1,1) = "Folder Name" 
$Sheet.Cells.Item(1,2) = "Folder Permissions" 
$intRow = 2 
$WorkBook = $Sheet.UsedRange 
$WorkBook.Font.Bold = $True 

$data = Import-Csv -Path C:\xPowerShellScripts\FolderList.txt -Header "Path" -Delimiter "," 
foreach ($head in $data) 
{ 
$Permission = (Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference 
$Sheet.Cells.Item($intRow, 1) = $head.Path 
$Sheet.Cells.Item($intRow, 2) = $Permission 
$intRow = $intRow + 1 
} 

$WorkBook.EntireColumn.AutoFit() 
$intRow = $intRow + 1 
$Sheet.Cells.Item($intRow,1).Font.Bold = $True 
$Sheet.Cells.Item($intRow,1) = "Folder Permissons Report" 
+0

你這樣做是困難的。請給我幾分鐘的時間寫下來,我會爲你解答。 – TheMadTechnician

+0

@WhiteHat他已經考慮到了這一點,儘管他的劇本還存在其他固有的問題,但是他的具體問題不是問題。 – TheMadTechnician

+0

請給我們錯誤消息:) – FoxDeploy

回答

1

發現此問題。

錯誤消息:

Exception from HRESULT: 0x800A03EC 
At line:18 char:1 
+ $Sheet.Cells.Item($intRow, 2) = $Permission 

出錯行:

$Sheet.Cells.Item($intRow, 2) = $Permission 

這樣做的原因是,你想寫一個價值$Permission這實際上是對象數組,所有其中包含您想在其Value屬性內的信息。這裏是$權限實際上是這樣的:

PS C:\temp> $Permission 

Value       
-----       
BUILTIN\Administrators   
BUILTIN\Administrators   
NT AUTHORITY\SYSTEM    
NT AUTHORITY\SYSTEM    
NT AUTHORITY\Authenticated Users 
NT AUTHORITY\Authenticated Users 
BUILTIN\Users     
BUILTIN\Users 

的修復程序,這是用-join "`n"做一個大的小區,在它的許多換行符,包含所有的權限比正常細胞高個子。

$Sheet.Cells.Item($intRow, 2) = $Permission.Value -join "`n" 

結果:

enter image description here

如果你想也有cloumn爲用戶拒絕訪問,使用這個來代替。 Gist Link.

+0

FoxDeploy:這正是我知道的問題是我不知道如何解決它。非常感謝您爲您快速簡潔的回答。我一頭撞牆,因爲我不知道該怎麼說,而且我不願意提供太多信息,因爲我可能會對解決方案造成偏見。你最好再次感謝。 – JRN

+0

在@TheMadTechnician向我推薦這個想法之後,我添加了一些邏輯來爲Access Denied用戶添加另一個列。 – FoxDeploy

2

不要再這麼做了。不要逐個更新單元格,收集所有數據,將其轉換爲製表符分隔的CSV,然後將所有內容粘貼到Excel中。

因此,對於$Permission中的每個項目,您將使用您想要的值創建[PSCustomObject],然後我們將收集數組中的所有值。

[array]$AllPerms = foreach ($head in $data) 
{ 
    (Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference | ForEach{ 
     [PSCustomObject]@{ 
      "Folder Name"=$Head.Path 
      "Folder Permissions"=$_.value 
     } 
    } 
} 

這將創建一個對象數組,並且每個對象將具有您在列中查找的兩個屬性。現在我們有了這個數組,我們將它轉​​換爲製表符分隔的CSV並將其複製到剪貼板。

$AllPerms | ConvertTo-Csv -Delimiter "`t" -NoTypeInfo | Clip 

好了,現在我們把它粘貼到工作表的第一個單元格:

$Sheet.Cells.Item(1).PasteSpecial() | Out-Null 

在這之後我會帶格式的照顧。所以整個事情看起來像這樣到底:

$ErrorActionPreference = "Stop" 

$Excel = new-Object -comobject Excel.Application 
$Excel.visible = $True 
$Workbook = $Excel.Workbooks.Add() 
$Sheet = $Workbook.Worksheets.Item(1) 

$data = Import-Csv -Path C:\xPowerShellScripts\FolderList.txt -Header "Path" -Delimiter "," 

[array]$AllPerms = foreach ($head in $data) 
{ 
    (Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference | ForEach{ 
     [PSCustomObject]@{ 
      "Folder Name"=$Head.Path 
      "Folder Permissions"=$_.value 
     } 
    } 
} 

$AllPerms | ConvertTo-Csv -Delimiter "`t" -NoTypeInfo | Clip 

$Sheet.Cells.Item(1).PasteSpecial() | Out-Null 

$Footer = $Sheet.Cells.Item($(($Sheet.UsedRange.Rows)|Select -Last 1 -Expand Row)+1,1) 
$Sheet.Rows.Item(1).Font.Bold = $True 
$Sheet.UsedRange.EntireColumn.AutoFit() | Out-Null 
$Footer.Font.Bold = $True 
$Footer.Value2 = "Folder Permissons Report"