Powershell 如何递归地从文件/目录中获取 ACL,也包括"["或"]"



下面的脚本适用于大多数文件和文件夹,但不适用于带有"["]"的文件和文件夹

#Set variables
$path =  $args[0]
$filename = $args[1]
$date = Get-Date
#Place Headers on out-put file
$list = "Permissions for directories in: $Path"
$list | format-table | Out-File "C:PowershellResults$filename"
$datelist = "Report Run Time: $date"
$datelist | format-table | Out-File -append "C:PowershellResults$filename"
$spacelist = " "
$spacelist | format-table | Out-File -append "C:PowershellResults$filename"
#Populate Folders Array
[Array] $folders = Get-ChildItem -path $path -force -recurse 
#Process data in array
ForEach ($folder in [Array] $folders)
{
#Convert Powershell Provider Folder Path to standard folder path
$PSPath = (Convert-Path $folder.pspath)
$list = ("Path: $PSPath")
$list | format-table | Out-File -append "C:PowershellResults$filename"
Get-Acl -path $PSPath | Format-List -property AccessToString | Out-File -append "C:PowershellResults$filename"
"-----------------------" | Out-File -FilePath "C:PowershellResults$filename" -Append
} #end ForEach  

我不确定这能做100%相同的事情,但我使用的是下面的一行

get-childitem "C:windowstemp" -recurse | get-acl | Format-List | Out-File "c:tempoutput.txt"

问题在于Convert-Path cmdlet试图"解释"路径,包括它"解释"为通配符的方括号。相反,您希望使用文字路径。

更改此行:

$PSPath = (Convert-Path $folder.pspath)

对此:

$PSPath = (Convert-Path -LiteralPath $folder.pspath)

另外,将Get-Acl -path更改为Get-Acl -LiteralPath,使其看起来像这样:

Get-Acl -LiteralPath $PSPath | Format-List -property AccessToString | Out-File -append "C:PowershellResults$filename"

如果您没有PowerShell 3.0版(其中添加了Get-Acl-LiteralPath支持),您可以使用Get-Item作为解决方法:

$item = Get-Item -LiteralPath $PSPath
$item.GetAccessControl() | Format-List -property AccessToString | Out-File -append "C:PowershellResults$filename"

有关更多信息,请参阅本文:LiteralPaths

get-aclliteralpath的支持直到Powershell V3才添加。

如果您一直在使用早期版本,并且由于任何原因无法升级到V3,请使用@HAL9256建议convert-path,但对于get-acl部分,这应该有效:

((Get-Item -LiteralPath $PSPath).GetAccessControl()).AccessToString | Out-File -append "C:PowershellResults$filename"

我对@peter的一行进行了轻微的更改。它大大加快了速度:

获取子项"C: \windows\temp&quot-文件夹-递归|get-acl |导出CSV"c: \temp\output.csv&quot-nottype-附加

最新更新