如何使用Powershell递归获取文件/目录的ACL,包括"["或"]"字符。

4

我已经有了下面的脚本,可以用于大多数文件和文件夹,但是对于带有 "[" "]" 的文件和文件夹无效。

#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:\Powershell\Results\$filename"
$datelist = "Report Run Time: $date"
$datelist | format-table | Out-File -append "C:\Powershell\Results\$filename"
$spacelist = " "
$spacelist | format-table | Out-File -append "C:\Powershell\Results\$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:\Powershell\Results\$filename"

Get-Acl -path $PSPath | Format-List -property AccessToString | Out-File -append "C:\Powershell\Results\$filename"

"-----------------------" | Out-File -FilePath "C:\Powershell\Results\$filename" -Append

} #end ForEach  
4个回答

8

我不确定这个方法是否完全相同,但我正在使用以下一行代码

get-childitem "C:\windows\temp" -recurse | get-acl | Format-List | Out-File "c:\temp\output.txt"

1
这篇文章是我在这个页面上唯一能够运行的一篇。 - Tequila

5
问题出在Convert-Path命令尝试“解释”路径,包括方括号,被解释为通配符。你需要让它使用文字路径。请改变这一行:
$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:\Powershell\Results\$filename"

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

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

更多信息请参见此文章:LiteralPaths

谢谢,但是通过使用 $PSPath = (Convert-Path -LiteralPath $folder.pspath) 进行修改后,脚本只能在文件夹的根目录下工作,并且不能递归地获取访问控制列表。 - Eduardo
请参见上面的编辑。您还需要将 Get-Acl -Path 更改为 Get-Acl -LiteralPath,否则 Get-Acl 也会因方括号而出错。 - HAL9256
谢谢,但似乎 get-acl 不支持 LiteralPaths。 - Eduardo
2
Graham Gold比我先完成了它。Get-Acl -LiteralPath是在Windows PowerShell 3.0中引入的(http://technet.microsoft.com/en-us/library/hh849802.aspx)。 - HAL9256
@HAL9256 谢谢你的回答。值得注意的是,GetAccessControl() 方法存在于 PowerShell v1 中,但由于某种原因它返回 $null。然而,在 PowerShell v2 上这种技术非常有效。 - Frank Lesniak

1

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

如果您使用的是早期版本,并且由于某种原因无法升级到V3,请按照@HAL9256的建议使用convert-path,但是对于get-acl部分,可以尝试使用以下方法:

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

0

我对 @peter 的一行代码进行了轻微修改,这样可以加快速度:

Get-Childitem "C:\windows\temp" -folder -recurse | get-acl | Export-CSV "c:\temp\output.csv" -notype -append


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接