Запрос фильтра событий WMI в сценарии PowerShell

Я пытаюсь добавить два разных события WMI на сервер SCCM с помощью сценария PowerShell, который написал кто-то другой. Мне нужно объединить два запроса событий в один запрос, и я не уверен, как это лучше сделать. Я пробовал это кучу разных способов до сих пор. Вот код:

Function WMI-InstanceFilter
{
# Function Started
LogTraceMessage "*** Function WMI-InstanceFilter Started ***"
Write-Verbose "*** Function WMI-InstanceFilter Started ***"

$PropertyHash = @{
    QueryLanguage = "WQL";
    Query = "";
    Name = "Name";
    EventNameSpace="root/sms/site_$($SiteCode)"
    }

$Script:InstanceFilter = New-CimInstance -Namespace root/subscription -ClassName __EventFilter -Property $PropertyHash -Verbose -ErrorAction Stop

Вот два запроса событий, которые мне нужно как-то объединить и поместить в строку запроса:

SELECT * FROM __InstanceOperationEvent Within 900 Where TargetInstance ISA 'SMS_Package' and TargetInstance.Name like 'drivers - %'"

SELECT * FROM __InstanceOperationEvent Within 300 Where TargetInstance ISA 'SMS_Package' and TargetInstance.Name like 'BIOS - %'"

Как лучше всего это сделать?


person Chris    schedule 24.08.2018    source источник
comment
Вы можете комбинировать запросы имени следующим образом: TargetInstance.Name LIKE 'drivers - %' OR TargetInstance.Name LIKE 'BIOS - %'. Однако я не думаю, что вы можете комбинировать тайминги, поэтому вам нужно будет выбрать одну продолжительность для предложения WITHIN, так как теперь это один запрос.   -  person boxdog    schedule 24.08.2018


Ответы (1)


Вы имеете дело с WQL в своих запросах, и у вас может быть только одно значение WITHIN — см. https://docs.microsoft.com/en-gb/windows/desktop/WmiSdk/within-clause, так что вам придется выбрать либо 300 (секунды = 5 минут), либо 900. (секунды = 15 минут) или компромиссное значение где-то между ними.

Ваш комбинированный оператор SELECT будет выглядеть так

SELECT * FROM __InstanceOperationEvent WITHIN 900 WHERE TargetInstance ISA 'SMS_Package' AND TargetInstance.Name LIKE 'drivers - %' OR TargetInstance.Name LIKE 'BIOS - %'

Измените значение WITHIN на то, что, по вашему мнению, лучше всего подходит для ваших нужд.

Вам нужны и диск, и биос одновременно, или вы можете использовать оператор переключателя, управляемый параметрами, для переключения между ними?

Что-то вроде этого

Function WMI-InstanceFilter {
[CmdletBinding()]
param (
  [ValidateSet('Bios', 'Drivers' )]
  [string]$InstanceType
)

# Function Started
LogTraceMessage "*** Function WMI-InstanceFilter Started ***"
Write-Verbose "*** Function WMI-InstanceFilter Started ***"

switch ($InstanceType) {
 'Bios' {
          $query = "SELECT * FROM __InstanceOperationEvent Within 900 Where TargetInstance ISA 'SMS_Package' and TargetInstance.Name like 'drivers - %'"
        }
  'Drivers' {
          $query = "SELECT * FROM __InstanceOperationEvent Within 300 Where TargetInstance ISA 'SMS_Package' and TargetInstance.Name like 'BIOS - %'"
        }
}

$PropertyHash = @{
    QueryLanguage = "WQL"
    Query = $query
    Name = "Name"
    EventNameSpace="root/sms/site_$($SiteCode)"
    }

$Script:InstanceFilter = New-CimInstance -Namespace root/subscription -ClassName __EventFilter -Property $PropertyHash -Verbose -ErrorAction Stop
}
person Richard Siddaway    schedule 26.08.2018
comment
Нет, не нужно делать их одновременно, просто не было уверенности, что это можно сделать по-другому. Как будет выглядеть оператор switch, управляемый параметрами? Дайте мне знать, и я приму ваш ответ в любом случае. - person Chris; 27.08.2018
comment
Я добавил возможную функцию к ответу - person Richard Siddaway; 28.08.2018
comment
Попытка запустить то, что вы написали, но это не сработало, и в файле журнала указано, что для переменной ErrorMessage установлено значение System.ArgumentException: не удалось вывести CimType из предоставленного объекта .NET. - person Chris; 30.08.2018
comment
Выполняются ли запросы вне функции, т.е. можно ли вручную создать CIMinstance? - person Richard Siddaway; 30.08.2018
comment
Неа. New-CimInstance: не удалось вывести CimType из предоставленного объекта .NET. - person Chris; 05.09.2018