SCCM WQL 查询 - 列出特定已安装应用程序的版本?

SCCM WQL Query - List version of a specific installed application?

我很难为 SCCM 创建 WQL 查询,因为我真的很新,很少以复杂的方式使用它。

我的目标是列出 3 件事:计算机名称 - 显示名称 ("Google Chrome") - 显示版本(Google Chrome 条目)

我从这个开始:

$SiteCode = "XXX"
$SiteServer = "XXX"


$query = @"

select SMS_R_System.Name, SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName, SMS_G_System_ADD_REMOVE_PROGRAMS.Version
from  SMS_R_System
inner join SMS_G_System_ADD_REMOVE_PROGRAMS
on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId
where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "Google Chrome"

"@


Get-WmiObject -namespace root\sms\site_$SiteCode -computer $SiteServer -query $query

输出对我来说有点奇怪:

__GENUS                          : 2
__CLASS                          : __GENERIC
__SUPERCLASS                     : 
__DYNASTY                        : __GENERIC
__RELPATH                        : 
__PROPERTY_COUNT                 : 2
__DERIVATION                     : {}
__SERVER                         : XXX
__NAMESPACE                      : root\sms\site_PR1
__PATH                           : 
SMS_G_System_ADD_REMOVE_PROGRAMS : System.Management.ManagementBaseObject
SMS_R_System                     : System.Management.ManagementBaseObject
PSComputerName                   : XXX

我在这里错过了什么?同样,我在这方面真的很陌生,所以我一定错过了逻辑的关键部分。

如果我删除:

, SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName, SMS_G_System_ADD_REMOVE_PROGRAMS.Version

查询有效并向我显示了所有安装了 Chrome 的计算机:

__GENUS          : 2
__CLASS          : SMS_R_System
__SUPERCLASS     : SMS_Resource
__DYNASTY        : SMS_BaseClass
__RELPATH        : 
__PROPERTY_COUNT : 1
__DERIVATION     : {SMS_Resource, SMS_BaseClass}
__SERVER         : XXX
__NAMESPACE      : root\sms\site_XXX
__PATH           : 
Name             : PXXX
PSComputerName   : XXX

但我也想要这 2 个属性,而不仅仅是计算机名称,这样我就可以确认版本号。

非常感谢。

答案就是 "expand" @TheIncorrigible 指出的词典。

所以这就是我最终使用 Select-Object 中的 Name/Expression 方法完成它的方法:

$query = @"

select SMS_R_System.Name, SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName, SMS_G_System_ADD_REMOVE_PROGRAMS.Version
from  SMS_R_System
inner join SMS_G_System_ADD_REMOVE_PROGRAMS
on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId
where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "Google Chrome"

"@


Get-WmiObject -namespace root\sms\site_$SiteCode -computer $SiteServer -query $query | Select-Object @{name='ComputerName';expression={$_.SMS_R_System.Name} }, @{name='DisplayName';expression={$_.SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName} }, @{name='Version';expression={$_.SMS_G_System_ADD_REMOVE_PROGRAMS.Version} }

以另一种方式扩展我的评论以处理手头的问题:

$wmiParams = @{
    Namespace    = 'root/sms/site_XXX'
    ComputerName = 'XXX'
    Query        = @'
SELECT SMS_R_System.Name, SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName, SMS_G_System_ADD_REMOVE_PROGRAMS.Version
FROM SMS_R_System
INNER JOIN SMS_G_System_ADD_REMOVE_PROGRAMS
ON SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId
WHERE SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "Google Chrome"
'@
}
$smsResults = Get-WmiObject @wmiParams

foreach ($object in $smsResults) {
    [pscustomobject]@{
        ComputerName = $object['SMS_R_System']['Name']
        DisplayName  = $object['SMS_G_System_ADD_REMOVE_PROGRAMS']['DisplayName']
        Version      = $object['SMS_G_System_ADD_REMOVE_PROGRAMS']['Version']
    }
}