使用Powershell的目录上的GetAccessControl()返回没有数据

使用Powershell的目录上的GetAccessControl()返回没有数据

问题描述:

我有一个目录,其名称中包含方括号,使得在Powershell中处理它有点问题。我见过有关获取目录ACL的建议,应该使用GetAccessControl()方法DirectoryInfo而不是使用cmdlet Get-Acl使用Powershell的目录上的GetAccessControl()返回没有数据

不幸的是,使用GetAccessControl()不会返回任何目录的任何结果。看到我的脚本下面。

$filename = "C:\somefolder" 
$di = get-item $filename 
$di | get-acl # this returns the correct ACL data as expected 
$di.GetAccessControl() # this shows an empty ACL (see below output) 

我的意思空的ACL是这样的:

Path  Owner  Access 
----  -----  ------ 

我发现得到$迪的一个实例,用含有方括号的目录名的唯一方法是逃避支架采用双背蜱

$filename = "C:\some``[folder``]withsquarebrackets" 

如果我这样做,然后执行$di = get-item $filename$di表明,它含有对指定文件夹的详细信息。

$di | get-acl  # does nothing, doesn't even show an empty ACL 
$di.GetAccessControl() # shows an empty ACL as seen above 

任何人都可以解释我是如何能够可靠地获得ACL对文件夹的枚举,其中一些包含他们的名字方括号:但在这种情况下,不同的结果由剩余的两行返回?

更新2012-02-23 16:31Z 后安迪·阿里斯门迪报告说,它为他工作,我建立了GetAccessControl()似乎对PowerShell的2.做工精细感染的机器上运行PowerShell的1.任何想法如何使用Powershell 1解决这个问题?

虽然Path属性为空,但它似乎对我有用。

$f = Get-Item 'C:\some `[folder`]' 
$f.GetAccessControl() 
$f.GetAccessControl().Access 
+0

有趣。我在另一台机器上尝试过它,它工作。原始机器运行Powershell v1,并且运行Powershell v2。在两台机器上,如果文件名包含方括号,则将$ f传送给Get-Acl cmdlet不会返回结果。 – 2012-02-23 16:25:09

+0

虽然...在文件名中的单个back-tick会产生相同的结果,但我明显错误地指出了双重返回。 – 2012-02-23 16:43:01

+0

@RichardFawcett查看这个[bug](https://connect.microsoft.com/PowerShell/feedback/details/544237/filename-bracket-problem)报告。有人发布了一个解决方法,我将它添加到我的答案中,试试看。 – 2012-02-26 09:22:57

方括号问题是因为方括号是“通配符”通配符。你能避免所有的转义使用-LiteralPath参数:

$di = get-item -literalpath C:\some[folder]withsquarebrackets 
$di.getaccesscontrol() 

遗憾的是他们并没有包括GET-ACL中的-literpath参数,所以你坚持做一开始的项目,然后用getaccesscontrol ()方法来获取访问列表。 Get-Acl在V3中有一个-literalpath参数。

+0

+1这确实有帮助。在我的情况下,无效路径是由'FileSystemObject.GetFolder.SubFolders'返回的。所以我的剧本运行了几分钟,然后突然无故休息。另一个MS警告将它踢在后面。尽管通配符总是有很好的理由,但这条路由Windows已经返回,该脚本之前并不知道它。 – 2013-04-18 08:37:05