使用通配符和WMIC版本查询

时间:2014-11-20 15:23:22

标签: powershell wmi-query wmic

我是一名拥有良好PowerShell经验的InfoSec管理员。我会保持简短和甜蜜:

([WMI] "\\$comp\root\CIMV2:CIM_DataFile.Name='$path'").Version)

我使用它来调用文件版本而不是使用get-item VersionInfo.ProductVersion,因为这并不总是返回准确的值。它运作良好。但是,当$ path等于这样的东西时:

C:\Windows\System32\Macromed\Flash\Flash*.ocx

查询无效,因为找不到该文件。我想这是因为变量周围的单引号忽略了通配符。

我承认我确实找到了解决问题的方法(JPBlanc发布的答案):

Powershell get-item VersionInfo.ProductVersion incorrect / different than WMI

但是,我想知道我是否可以在现有脚本中使用通配符。

2 个答案:

答案 0 :(得分:1)

您不能直接传递通配符,但可以使用该通配符查询文件系统,然后遍历结果。在这两种情况下,我都假设您正在远程执行此操作。

$FlashFiles = invoke-command -computername $comp {Get-ChildItem C:\Windows\System32\Macromed\Flash\Flash*.ocx;};
foreach ($File in $FlashFiles) {
    write-output "$($File.Fullname): $(([WMI] "\\$comp\root\CIMV2:CIM_DataFile.Name='$($File.FullName)'").Version)"
}

或者使用单个管道进行操作:

invoke-command -computername $comp {Get-ChildItem C:\Windows\System32\Macromed\Flash\Flash*.ocx||foreach-object {write-output "$($_.Fullname): $(([WMI] "\\$comp\root\CIMV2:CIM_DataFile.Name='$($_.FullName)'").Version)"};

你可以通过在远程计算机本地运行WMI查询来使后者更快(你也可以用第一个来做,但它不是那么漂亮)

invoke-command -computername $comp {Get-ChildItem C:\Windows\System32\Macromed\Flash\Flash*.ocx|foreach-object {write-output "$($_.Fullname): $(([WMI] "\\.\root\CIMV2:CIM_DataFile.Name='$($_.FullName)'").Version)"}};

答案 1 :(得分:0)

Name的{​​{1}}属性不能包含通配符。我不相信他们中的任何一个都可以。

但是,您可以指定CIM_DataFileDrivePath来获取列表:

Extension

Get-WmiObject -ComputerName $comp -Class CIM_DataFile -Filter "Drive='C:' AND Path='\\Windows\\System32\\Macromed\\Flash\\' AND Extension='ocx'" 的语法有点不稳定。例如,您需要尾部反斜杠。

您还可以通过管道Path进行进一步过滤:

Where-Object