簡體   English   中英

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 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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM