Фильтр запросов SCCM - PullRequest
       17

Фильтр запросов SCCM

0 голосов
/ 10 сентября 2018

Я пытаюсь написать запрос в 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. Кроме того, когда запрос выполняется, он показывает только имя компьютера. Как лучше всего отображать не только имя машины, но и версию?

1 Ответ

0 голосов
/ 11 сентября 2018

Запрос 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'
...