【问题标题】:WMI event filter query in PowerShell scriptPowerShell 脚本中的 WMI 事件过滤器查询
【发布时间】:2018-08-24 14:25:12
【问题描述】:

我正在尝试使用其他人编写的 PowerShell 脚本将两个不同的 WMI 事件添加到 SCCM 服务器。我必须将两个事件查询合并为一个查询,但我不确定如何最好地做到这一点。到目前为止,我已经尝试了很多不同的方法。代码如下:

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

最好的方法是什么?

【问题讨论】:

  • 您可以像这样组合名称查询:TargetInstance.Name LIKE 'drivers - %' OR TargetInstance.Name LIKE 'BIOS - %'。但是,我认为您不能组合时间,因此您需要为 WITHIN 子句选择一个持续时间,因为它现在是一个查询。

标签: powershell wmi wql


【解决方案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 值更改为您认为最适合您需要的值。

您是否同时需要驱动器和 BIOS,或者您可以使用参数驱动的 switch 语句在它们之间进行交换?

类似的东西

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
}

【讨论】:

  • 不,不必同时进行,只是不确定其他方法。参数驱动的 switch 语句会是什么样子?让我知道,无论哪种方式我都会接受你的回答。
  • 我在答案中添加了一个可能的功能
  • 尝试运行您编写的内容,但没有成功,日志文件显示“变量 ErrorMessage 设置为 System.ArgumentException:无法从提供的 .NET 对象推断 CimType。”
  • 查询是否在函数之外运行,即您可以手动创建 CIMinstance 吗?
  • 不。 “New-CimInstance : 无法从提供的 .NET 对象推断 CimType。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多