none
WMI Filter nicht auf alle Spalten anwendbar? RRS feed

  • Frage

  • Hallo zusammen, 

    ich habe hier grade ein mir unerklärliches Verhalten bei einer WMI-Abfrage.
    Kann es sein, dass nicht alle Felder einer Class filterbar sind?

    Hier ein Beispiel:

    Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerSettingElementSettingDataIndex -filter "SettingData like '%245d8541-3943-4422-b025-13a784f679b7%'"

    Das führt sofort zu diesem Fehler: 

    Get-WmiObject : Die Anfrage ist ungültig. "select * from Win32_PowerSettingElementSettingDataIndex where SettingData = '%245d8541-3943-4422-b025-13a784f679b7%'"

    Ein Element aus dieser Class sieht folgendermaßen aus:

    __GENUS          : 2
    __CLASS          : Win32_PowerSettingElementSettingDataIndex
    __SUPERCLASS     : CIM_ElementSettingData
    __DYNASTY        : CIM_ElementSettingData
    __RELPATH        : Win32_PowerSettingElementSettingDataIndex.ManagedElement="Win32_PowerSetting.InstanceID=\"Microsoft:PowerSetting\\\\{0e796bdb-100d-47d6-a2d5-f7d2daa51f51}\"",SettingData="Win32_PowerSettingDataIndex.InstanceI
                       D=\"Microsoft:PowerSettingDataIndex\\\\{82d8678b-3d8b-43f8-ad26-a2ad810aa1cf}\\\\DC\\\\{0e796bdb-100d-47d6-a2d5-f7d2daa51f51}\""
    __PROPERTY_COUNT : 6
    __DERIVATION     : {CIM_ElementSettingData}
    __SERVER         : PC
    __NAMESPACE      : root\cimv2\power
    __PATH           : \\PC\root\cimv2\power:Win32_PowerSettingElementSettingDataIndex.ManagedElement="Win32_PowerSetting.InstanceID=\"Microsoft:PowerSetting\\\\{0e796bdb-100d-47d6-a2d5-f7d2daa51f51}\"",SettingData="Win32_Po
                       werSettingDataIndex.InstanceID=\"Microsoft:PowerSettingDataIndex\\\\{82d8678b-3d8b-43f8-ad26-a2ad810aa1cf}\\\\DC\\\\{0e796bdb-100d-47d6-a2d5-f7d2daa51f51}\""
    IsACSetting      : 2
    IsCurrent        : 2
    IsDefault        :
    IsNext           :
    ManagedElement   : Win32_PowerSetting.InstanceID="Microsoft:PowerSetting\\{0e796bdb-100d-47d6-a2d5-f7d2daa51f51}"
    SettingData      : Win32_PowerSettingDataIndex.InstanceID="Microsoft:PowerSettingDataIndex\\{82d8678b-3d8b-43f8-ad26-a2ad810aa1cf}\\DC\\{0e796bdb-100d-47d6-a2d5-f7d2daa51f51}"
    PSComputerName   : PC

    Auf die ganzen Is...-Felder kann ich filtern. Auf ManagedElement, SettingData aber nicht. Egal was ich da nach dem like und welchem Operator auch immer eingebe.

    Sind diese Props einfach zu groß und WQL mag einfach keine Fulltext-Searches?

    Donnerstag, 16. Juli 2020 12:14

Antworten

  • Moin,

    in WMI ist SettingData ein Objekt vom Typ Win32_PowerSettingDataIndex. Daher geht da kein Stringvergleich.

    Kannst alle ziehen und mit PowerShell filtern, da ist es zu einem String geplättet:

    $o = (Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerSettingElementSettingDataIndex).Where({$_.SettingData -like "*245d8541-3943-4422-b025-13a784f679b7*"})


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert Manuel Aigner Donnerstag, 16. Juli 2020 12:59
    Donnerstag, 16. Juli 2020 12:47

Alle Antworten

  • Moin,

    in WMI ist SettingData ein Objekt vom Typ Win32_PowerSettingDataIndex. Daher geht da kein Stringvergleich.

    Kannst alle ziehen und mit PowerShell filtern, da ist es zu einem String geplättet:

    $o = (Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerSettingElementSettingDataIndex).Where({$_.SettingData -like "*245d8541-3943-4422-b025-13a784f679b7*"})


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert Manuel Aigner Donnerstag, 16. Juli 2020 12:59
    Donnerstag, 16. Juli 2020 12:47
  • Aiai, da hast du natürlich recht. Das ist mir so jetzt gar nicht aufgefallen, denn die Powershell macht daraus nen String und mein WMI-Explorer zeigt mir das auch nicht an. 

    Gut, dann muss ich wohl doch über Powershell filtern. Wollte mir das aus Performancegründen eigentlich sparen :)


    Donnerstag, 16. Juli 2020 13:00
  • Moin,

    das bekämest Du auch mit WMI hin, musst aber den Filter entsprechend gestalten, mit verschachtelten Abfragen und so.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Donnerstag, 16. Juli 2020 13:03
  • Muss ja gestehen, dass ich WMI gar nicht mal so gerne verwende und im Normalfall alles in der PS nachbearbeite. Nur in dem speziellen Fall sind hier mehrere 1000 Records in der Class die ich mit einer anderen Class die auch ähnliche viele Records beinhaltet korrelieren muss. Das wird mit verschachtelten Foreaches in der PS dann eher langsam. Daher hätte ich gerne den Output von gwmi so schlank wie möglich gehalten.

    Ach ja, ich versuche nen anständigen Powerplan Wrapper in PS zu schreiben. Im Speziellen um die Deltas zwischen Powerplänen besser vergleichen zu können. Die Powercfg.exe ist hier programmatisch für mich ne Katastrophe.

    EDIT: Habs grade gemessen. 

    - Direkte WMI-Abfrage mit dem Filter dauert ca. 300ms (habs jetzt auf __RELPATH gefiltert, da gehts auch :))

    -Über Powershell WHERE-Object -Like dauert's knapp 900ms
    -Über Powershell WHERE-Object -Match ganze 6 Sekunden

    Hätte ich nicht gedacht. Bis jetzt kam mir Regex eigentlich immer deutlich flotter vor, als Like

    • Bearbeitet Manuel Aigner Donnerstag, 16. Juli 2020 13:22 Zusatz Info
    Donnerstag, 16. Juli 2020 13:13