Powershell - 如何在另一个WMI查询中使用一个WMI查询的结果?

时间:2013-07-10 21:01:44

标签: powershell powershell-v2.0

尝试列出服务器上共享的用户权限,其中共享的路径中包含公共文件路径元素。

我有一个成功使用Win32_LogicalShareSecuritySetting WMI类的脚本来枚举服务器上所有共享的共享权限,但不幸的是,该类没有共享的文件路径作为属性...我可以使用Win32_Share类并执行以下操作:

$FinShares = Get-WmiObject -Class Win32_Share -Filter "Path LIKE '%Finance%'" -ComputerName $computername

我确实得到了所需股票的清单。但是如何将该列表传递给下一个Get-WmiObject语句?我尝试过类似的东西:

$FinShares = (Get-WmiObject -Class Win32_Share -Filter "Path LIKE '%Finance%'" -ComputerName $computername | Select-Object Name)

foreach ($ShareInst in $FinShares)
     {
     $FinShareSS = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter "Name = '$ShareInst'" -ComputerName $computername
     $SecurityDescriptor = $FinShareSS.GetSecurityDescriptor()
(...)

当我尝试这个时,变量$FinShareSS仍然为空...有人可以给我一个指针(或者某种更好的方式),我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

问题是您的过滤器使用$ ShareInst;它不起作用,因为它没有像你期望的那样返回Name。尝试在你的foreach循环中放入“$ ShareInst”;你应该看到像这样的东西:

\ COMPUTERNAME \根\ CIMV2:Win32_Share.Name = “ADMIN $”

哪个是WMI对象的PATH,而不是它的名字。你在$ ShareInst中拥有的是System.Management.ManagementObject#root \ cimv2 \ Win32_Share类型的对象,而不是字符串。当您将该变量放在双引号内时,PowerShell使用对象.ToString()方法将变量扩展为字符串。对于此Win32_Share对象,返回对象的PATH,而不是名称。

所以基本上你只需要在-Filter字符串中获取实际的名字字符串,这样它就会实际返回你正在寻找的共享安全对象。有几种方法可以做到这一点:

将属性名称嵌入字符串中,如下所示:

 -Filter "Name = '$($ShareInst.Name)'"

$()包装器告诉PowerShell在将变量扩展为该长PATH值之前评估.Name属性,因此您只需获得您正在寻找的短名称。

如果您只需要名称的Win32_Share对象,那么您只需将foreach行更改为如下所示:

foreach ($ShareInst in ($FinShares | Select-Object -ExpandProperty Name))

Select-Object的-ExpandProperty参数告诉PowerShell获取每个对象的Name属性,然后返回该属性,而不是完整对象。现在$ ShareInst将只是Win32_Share的名称,因此您可以按原样保留过滤器。

有许多其他方法可以解决这个问题,但这两种方式对我来说似乎最直接。