powershell中的WMI查询';无效查询';

powershell中的WMI查询';无效查询';,powershell,wmi,get-wmiobject,Powershell,Wmi,Get Wmiobject,正在尝试了解有关WMI和powershell(noob)命令的更多信息 运行此: Get WMIObject-Namespace root\Subscription-Class\uu FilterToConsumerBinding 给我这个(好): 为什么此查询会给出与上面相同的结果: Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "__PATH LIKE '%SCM%'"

正在尝试了解有关WMI和powershell(noob)命令的更多信息

运行此:


Get WMIObject-Namespace root\Subscription-Class\uu FilterToConsumerBinding

给我这个(好):

为什么此查询会给出与上面相同的结果:

Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "__PATH LIKE '%SCM%'"
但是这个,在“过滤器”中查找文本:

Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "Filter LIKE '%SCM%'"`
给我一个无效的查询错误

    Get-WMIObject : Invalid query "select * from __FilterToConsumerBinding where Filter LIKE '%SCM%'"
    At line:1 char:1
    + Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerB ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ManagementException
        + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
我不明白为什么同一个查询不能在两个对象上工作? 谢谢

也不适用于EventConsumer,但适用于EventFilter

Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter "Name LIKE '%SCM%'"


__GENUS          : 2
__CLASS          : __EventFilter
__SUPERCLASS     : __IndicationRelated
__DYNASTY        : __SystemClass
__RELPATH        : __EventFilter.Name="SCM Event Log Filter"
__PROPERTY_COUNT : 6
__DERIVATION     : {__IndicationRelated, __SystemClass}
__SERVER         : COMPUTERNAME
__NAMESPACE      : ROOT\Subscription
__PATH           : \\COMPUTERNAME\ROOT\Subscription:__EventFilter.Name="SCM Event Log Filter"
CreatorSID       : {1, 2, 0, 0...}
EventAccess      : 
EventNamespace   : root\cimv2
Name             : SCM Event Log Filter
Query            : select * from MSFT_SCMEventLogEvent
QueryLanguage    : WQL
PSComputerName   : COMPUTERNAME

简短的回答。。。对属性进行筛选的能力取决于它是什么类型的WMI类以及属性类型

长长的回答。。。要获取有关PowerShell中WMI类的详细信息,请使用get-CimClass cmdlet。属性可以根据其返回的数据(即字符串、整数、布尔值)具有不同的值类型。在您的示例中,您试图查询属性“Filter”,它是一种引用类型。引用类型没有文本值,它只是对另一个类的实例的引用。您可以告诉引用属性,因为它显示了指向另一个类的完整或部分路径(如您在示例中看到的“\uu EventFilter”已被引用)。您还可以从此powershell命令获取属性类型信息:

Get-CimClass -Namespace "root\Subscription" -Class __FilterToConsumerBinding | Select-Object -ExpandProperty CimClassProperties | Where-Object {$_.Name -eq 'Filter'}
引用类型属性显示在将名为“Association”的类限定符设置为true的WMI类上。类限定符是类本身的属性,用于指示类的行为。使用此命令可以查看所有类限定符

Get-CimClass -Namespace "root\Subscription" -Class __FilterToConsumerBinding | Select-Object -ExpandProperty CimClassQualifiers
不幸的是,由于WQL是一种查询语言,您无法使用WHERE子句根据引用类型的属性筛选类的实例。您只能使用简单类型,例如字符串、整数或嵌入对象的属性(但嵌入对象非常罕见)

由于类_EventFilter是“Filter”属性引用的对象,并且该类具有简单的属性类型,因此我们可以从那里开始。您可以通过Name属性查询_EventFilter,这是一种字符串类型,没有任何问题

有一些高级查询技术(的
关联器和
引用)这可以帮助您通过基于引用的查询从_FilterToConsumerBinding获取实例,但这是一个多步骤的过程。我建议您在其中签出Microsoft文档,但这里有一个基本的两步PowerShell命令,该命令将首先获取引用实例的名称,然后获取引用它的任何实例的名称

$InstanceName = (Get-WmiObject -Namespace "ROOT\subscription" -Query "SELECT * FROM __EventFilter WHERE Name LIKE '%SCM%'").Name
Get-WmiObject -Namespace "ROOT\subscription" -Query "REFERENCES OF {__EventFilter.Name='$InstanceName'}"
由于
引用将搜索整个名称空间,因此可以通过添加WHERE子句并将ResultClass命名为目标类,将结果缩小到特定的类

Get-WmiObject -Namespace "ROOT\subscription" -Query "REFERENCES OF {__EventFilter.Name='$InstanceName'} WHERE ResultClass = __FilterToConsumerBinding"
这将返回仅从_FilterToConsumerBinding中查找的实例。(*请注意,类名周围没有引号。包含双引号或单引号将导致无效的查询错误

为了回答您关于uu EventConsumer类的问题,这提出了另一个称为抽象类的WMI概念。关于这一点,我不会详细介绍,但抽象类本质上是基类(其他类的起点)其他类可以继承。但与标准基类不同,抽象类不能有自己的实例。您可以通过获取_EventConsumer类的类限定符来确定类是否为抽象类。您会注意到,如果运行下面的命令,您将看到它具有“抽象”类限定符

Get-CimClass -Namespace "root\Subscription" -Class __EventConsumer | Select-Object -ExpandProperty CimClassQualifiers
由于抽象类本身不能包含任何实例,如果您枚举它,它将返回所有使用它作为基类的类的实例。在您的示例中,u EventConsumer实际上是从NTEventLogEventConsumer生成一个实例。因为枚举抽象类会返回许多不同的类,所以不一定会返回必须保证使用相同的属性进行筛选,因此除非对基类中包含的属性进行筛选,否则不允许进行筛选。若要查看WMI类的基类是什么,可以使用此命令并查看NTEventLogEventConsumer的基类是\uu EventConsumer

Get-CimClass -Namespace "root\Subscription" -Class NTEventLogEventConsumer | Select-Object -ExpandProperty CimSuperClassName
通常,您可以使用查询
SELECT*from\uu EventConsumer
枚举抽象类中的所有实例。这将显示所有实例,但一旦添加了一个WHERE子句,且该子句的属性未包含在基类中,您就会收到无效查询,或者不会返回任何实例。这就是您可以直接查询的原因y N事件消费者,但不是事件消费者

Get-CimClass -Namespace "root\Subscription" -Class NTEventLogEventConsumer | Select-Object -ExpandProperty CimSuperClassName

希望这能有所帮助。

我怀疑是因为
过滤器
是由该对象上的powershell生成的,而您实际需要的是类似“%SCM%”的
名称
谢谢您的回答@TheIncorrigible1我试图在上面编辑,它确实允许我查询属性过滤器。不,您的问题是在哪里查询
过滤器
专业版
\\.\root\Subscription:\uuu FilterToConsumerBinding
class.Get-WMIObject-Namespace root\Subscription-class\uu FilterToConsumerBinding |选择筛选器(这不对吗?)
Select Object-Property Filter
不是一个查询。它只是选择一个属性并将其转换为一个
pscustomobject
。正如我所说,powershell为你创建了一个好的属性。天哪,我读了又读,试图抓住它并理解它!我喜欢有答案的解释,对我来说,这就是谁stackoverflow的用途。谢谢,我将花大约一周的时间研究您的答案!请注意,Windows 7中不存在该属性。您必须改用
ClassGuid
。有关GUID,请参阅。