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']
}
}
我很难为 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']
}
}