SCCM查询过滤器

问题描述 投票:0回答:1

我试图在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的所有内容。此外,运行查询时,它仅显示计算机名称。不仅显示机器名称,还显示安装的版本的最佳方法是什么?

filtering .net-framework-version sccm
1个回答
0
投票

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.6小于4.10。但是,由于我们知道.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 DB,那么您也可以使用SQL而不是WQL,这样可以更快地加入,并且可以更好地加入。如果这是你的可能性,我建议你通过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'
© www.soinside.com 2019 - 2024. All rights reserved.