使用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
方括号问题是因为方括号是“通配符”通配符。你能避免所有的转义使用-LiteralPath参数:
$di = get-item -literalpath C:\some[folder]withsquarebrackets
$di.getaccesscontrol()
遗憾的是他们并没有包括GET-ACL中的-literpath参数,所以你坚持做一开始的项目,然后用getaccesscontrol ()方法来获取访问列表。 Get-Acl在V3中有一个-literalpath参数。
+1这确实有帮助。在我的情况下,无效路径是由'FileSystemObject.GetFolder.SubFolders'返回的。所以我的剧本运行了几分钟,然后突然无故休息。另一个MS警告将它踢在后面。尽管通配符总是有很好的理由,但这条路由Windows已经返回,该脚本之前并不知道它。 – 2013-04-18 08:37:05
有趣。我在另一台机器上尝试过它,它工作。原始机器运行Powershell v1,并且运行Powershell v2。在两台机器上,如果文件名包含方括号,则将$ f传送给Get-Acl cmdlet不会返回结果。 – 2012-02-23 16:25:09
虽然...在文件名中的单个back-tick会产生相同的结果,但我明显错误地指出了双重返回。 – 2012-02-23 16:43:01
@RichardFawcett查看这个[bug](https://connect.microsoft.com/PowerShell/feedback/details/544237/filename-bracket-problem)报告。有人发布了一个解决方法,我将它添加到我的答案中,试试看。 – 2012-02-26 09:22:57