Запрос 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 Tool, есть большая вероятность, что вы получите результат, подобный 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, что намного быстрее и позволяет лучше объединяться,Если это возможно для вас, я бы порекомендовал его для быстрых запросов / поиска по 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'