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

问题描述 投票:2回答:3

我的下面的脚本对大多数文件和文件夹都有效,但对带有"[""]"的文件和文件夹无效

#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  
powershell permissions ntfs
3个回答
6
投票

我不确定这是否能做到100%相同的事情,但我使用了下面的单行代码。

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

3
投票

问题在于 Convert-Path cmdlet试图 "解释 "路径,包括方括号,因为它把方括号解释为通配符。相反,你想让它使用真实的路径。

修改这一行。

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

改成这样

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

另外,把这行改成 Get-Acl -pathGet-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


1
投票

get-acl 支持 literalpath 直到Powershell V3才被加入。

如果你还在使用早期的版本,并且由于某种原因不能升级到V3,那么可以选择@HAL9256的建议,用 convert-path 但对于 get-acl 部分,这应该可以代替。

((Get-Item -LiteralPath $PSPath).GetAccessControl()).AccessToString | Out-File -append "C:\Powershell\Results\$filename"
© www.soinside.com 2019 - 2024. All rights reserved.