SCCM 查询过滤器

SCCM Query Filter

我正在尝试在 SCCM 中编写查询以查找低于特定版本的 .Net Framework。

我有:

select distinct SMS_R_System.Name from  SMS_R_System where SMS_R_System.Name not in (select distinct SMS_R_System.Name 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 = "Microsoft .NET Framework 4.6.2")

这显示了所有未命名为 4.6.2 的内容。我希望它显示低于 4.6.2 的所有内容。此外,当查询为 运行 时,它仅显示机器名称。不仅要显示机器名称,还要显示安装的版本的最佳方式是什么?

WQL 查询将是

select distinct SMS_R_System.Name, 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 like 'Microsoft .NET Framework 4%'  and Version < '4.6.2'

但是有几个注意事项。首先是版本的小于只是一个字符串比较。这意味着版本 10 小于 4,而 4.10 小于 4.6。但是,由于我们知道 .NET 版本的范围,并且我们知道这些版本不存在,所以我认为应该没问题。如果你想确定你将不得不使用一些编程语言将版本进一步拆分成它的部分并分析它们。

另一个是,这通常只检查版本 4。这是因为版本 1 可以与版本 4 一起安装,并且您会在结果中列出每台计算机。然而,由于 .NET 以一种特殊的方式工作,其中版本 1 通常与版本 4 一起安装,但版本 2 和 3 不是,如果您的安装非常旧,则可能会导致问题。因为这意味着 Windows 7 次安装,我认为这对你的情况来说可能没有问题。

最后一件事是,不幸的是 WQL 不是 SQL,如果您加入 类 并从两者获取信息,它的行为真的很疯狂。因此,如果您在某些 WMI 工具中执行此查询,则很有可能会得到类似 System.Management.ManagementBaseObject 的结果,而不是您想要的结果。为避免这种情况,您可以使用 powershell 执行如下查询:

$computername = "<SiteServer>"
$namespace = 'Root\SMS\site_<SiteCode>'
$query = "select distinct SMS_R_System.Name, 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 like 'Microsoft .NET Framework 4%'  and SMS_G_System_ADD_REMOVE_PROGRAMS.Version < '4.6.2'"

gwmi -ComputerName $computername -Namespace $namespace -Query $query | Select-Object -Property @{n='Name';e={$_.SMS_R_System.Name}}, @{n='Version';e={$_.SMS_G_System_ADD_REMOVE_PROGRAMS.Version}}

最后,如果您有权访问 SCCM 数据库,您还可以使用 SQL 而不是 WQL,后者速度快得多并且可以更好地加入。如果这对您来说是可能的,我会推荐它以快速 queries/lookups over WQL。 类 的名称略有不同,因此查询为:

select distinct v_R_System.Name0, v_Add_Remove_Programs.Version0 
  from 
v_R_System inner join v_Add_Remove_Programs 
  on 
v_Add_Remove_Programs.ResourceId = v_R_System.ResourceId 
  where 
v_Add_Remove_Programs.DisplayName0 like 'Microsoft .NET Framework 4%'  
  and 
v_Add_Remove_Programs.Version0 < '4.6.2'