Объединить запросы (запрос подвыбора WQL - Powershell - SCCM) - PullRequest
0 голосов
/ 05 июня 2019

Сейчас я использую два разных запроса и сравниваю полученные объекты, однако я бы предпочел уникальный запрос, который делает все необходимое, так как я хотел бы использовать его непосредственно в SCCM, а не только в PowerShell.

(Первый запрос создает объект со всеми компьютерами, на которых установлено определенное программное обеспечение x64, второй объект создает запрос со всеми компьютерами, на которых не установлено определенное программное обеспечение x86)

Два объекта сравниваются, и я могу получить нужный мне список (какие машины находятся в обоих объектах)

Однако, как бы я объединил эти два запроса, чтобы они все были в одном?

Как в:

Все компьютеры, которые ДЕЛАЮТ SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ 1" И НЕ ИМЕЮТ SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ2"

$SiteCode = "x"
$SiteServer = "x"

$query = @"

select *  from  SMS_R_System 
inner join SMS_G_System_ADD_REMOVE_PROGRAMS_64 
on SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceId = SMS_R_System.ResourceId 
where SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SOFTWARE1"
"@

$postes_xx = (Get-WmiObject -namespace root\sms\site_$SiteCode -computer $SiteServer -query $query).SMS_R_SYSTEM.Name


$query = @"

select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client
from SMS_R_System 
inner join SMS_G_System_COMPUTER_SYSTEM 
on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId 
where SMS_G_System_COMPUTER_SYSTEM.Name 
not in (select distinct SMS_G_System_COMPUTER_SYSTEM.Name 
       from  SMS_R_System
       inner join SMS_G_System_COMPUTER_SYSTEM
       on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId
       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 = "SOFTWARE2" )

"@


$postes_32x = Get-WmiObject -namespace root\sms\site_$SiteCode -computer $SiteServer -query $query | select -ExpandProperty name

Compare-Object $postes_xx $postes_x32 -IncludeEqual -ExcludeDifferent

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Кажется, что нет необходимости использовать класс SMS_G_System_Computer_System. Вот простая версия WQL, которая должна соответствовать вашим требованиям.

select SMS_R_System.Name 
from SMS_R_System 
where SMS_R_System.ResourceID in 
(select SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceID 
from SMS_G_System_ADD_REMOVE_PROGRAMS_64 
where SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SOFTWARE1") 
and SMS_R_System.ResourceID not in 
(select SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID 
from SMS_G_System_ADD_REMOVE_PROGRAMS 
where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "SOFTWARE2")

Надеюсь, мой ответ поможет вам и с нетерпением ждем ваших отзывов.

С наилучшими пожеланиями, Ray

1 голос
/ 06 июня 2019

Кажется, что вы можете просто включить все свои объединения и затем объединить оператор where с and.Вам придется настроить оператор select, чтобы включить столбцы, которые вас интересуют.

$query = @"

select *  from  SMS_R_System 
inner join SMS_G_System_ADD_REMOVE_PROGRAMS_64 
on SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceId = SMS_R_System.ResourceId 
inner join SMS_G_System_COMPUTER_SYSTEM 
on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId 
where (SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SOFTWARE1")
and (SMS_G_System_COMPUTER_SYSTEM.Name 
not in (select distinct SMS_G_System_COMPUTER_SYSTEM.Name 
       from  SMS_R_System
       inner join SMS_G_System_COMPUTER_SYSTEM
       on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId
       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 = "SOFTWARE2" ))

"@
...