Wie man es repariert "Der WinRM-Client kann die Anfrage nicht verarbeiten. Die Ressource-URI für eine Aufzählungsoperation mit WQL-Filter darf keine Schlüssel enthalten und der Klassenname muss '*' (Stern) sein".
Gemäß dem von WinRM implementierten WS-Management-Standard muss die Resource-URI, wenn Sie eine Aufzählung mit einem WQL-Abfragefilter durchführen, das Basisklassenframework breit ansprechen und nicht eine bestimmte Instanz oder einen bestimmten Klassennamen mit spezifischen Schlüsseln. * ) als Wildcard für den Klassennamen und darf keine spezifischen Instanzschlüssel (wie spezifische Dienstnamen, IDs oder Handles) enthalten. Wenn Ihr Skript, Befehl oder Management-Software eine URI konstruiert, die explizit eine Klasse benennt oder Instanzselektoren angibt, während gleichzeitig eine WQL weitergegeben wird __Filter, blockiert der WinRM-Client die Anfrage und wirft diesen Fehler.
Schrittweise Lösungen
Abhängig davon, ob Sie einen manuellen Befehl über winrm, ein PowerShell-Cmdlet ausführen oder ein benutzerdefiniertes Skript schreiben, verwenden Sie eine der folgenden Lösungen, um das Problem zu lösen.
Korrektur 1: Korrektur der Kommando-Syntax in winrm Nutzen
Wenn Sie das Kommandozeilenprogramm verwenden winrm.cmd Sie müssen die erforderlichen Ressourcen aufzählen, um sicherzustellen, dass -filter Schalter wird mit einer Ressourcen-URI gekoppelt, die mit einem Sternchen endet ( * ) und enthält keine Schlüssel.
- Öffnen. Command Prompt oder... PowerShell als Administrator.
- Überprüfen Sie Ihren ursprünglichen Befehl.
winrm enumerate wmicimv2/Win32_Service?Name=wuauserv -filter:"Select * from Win32_Service Where State='Running'" - Ändern Sie den Ressourcen-URI-Teil, um den Stern zu verwenden (
*) Wildcard und entfernen Sie den Schlüsselselektor (?Name=wuauservÄndern Sie Ihren Befehl so, dass er dieser Struktur entspricht:winrm enumerate wmicimv2/* -filter:"Select * from Win32_Service Where State='Running'" - Drücken Sie. Enter um den korrigierten Befehl auszuführen.
Korrektur 2: Einstellung von PowerShell Cmdlets ( Get-WSManInstance / Enumerate)
Wenn Sie native PowerShell WSMan Cmdlets verwenden, müssen Sie sicherstellen, dass -ResourceURI Parameter weist anstelle einer spezifischen CIM-Klasse oder Instanzschlüssel auf das Schema-Wildcard hin.
- Öffnen. PowerShell.
- Wenn Ihr fehlgeschlagener Code so aussieht:
Get-WSManInstance -ResourceURI "wmicimv2/Win32_Process" -Filter "Select * From Win32_Process Where Name='notepad.exe'" - Aktualisieren Sie
-ResourceURIDas Argument zu beenden./*so dass die WQL-Engine das Filtern der Klassen intern verarbeiten kann:Get-WSManInstance -ResourceURI "wmicimv2/*" -Filter "Select * From Win32_Process Where Name='notepad.exe'" - Führen Sie das aktualisierte Skript aus.
Korrektur 3: Verwendung alternativer PowerShell-Cmdlets (empfohlen)
Wenn Ihr Ziel einfach darin besteht, WMI/CIM-Daten über das WinRM-Protokoll aus der Ferne abzufragen, ist es viel einfacher und weniger fehleranfällig, CIM-Cmdlets anstelle von rohen WSMan-Blockbefehlen zu verwenden. CIM-Cmdlets verarbeiten automatisch die URI-Formatierung hinter den Kulissen.
- Öffnen. PowerShell.
- Ersetzen Sie Ihren komplexen WSMan-Zählbefehl durch den
Get-CimInstancecmdlet, das standardmäßig über WinRM ausgeführt wird:Get-CimInstance -ClassName Win32_Service -Filter "State='Running'" -ComputerName "RemoteComputerName" - Wenn Sie explizit eine vollständige WQL-Abfrage verwenden müssen, verwenden Sie die
-QueryParameter stattdessen:Get-CimInstance -Query "Select * from Win32_Service where State='Running'" -ComputerName "RemoteComputerName" - Laufen Sie den Befehl aus, um die Daten zu holen, ohne WinRM-Syntaxbeschränkungen auszulösen.
Es kann einige Fehler geben.. Learn Microsoft