如何修复 "WinRM客户端无法处理请求.使用WQL过器进行编号操作的资源URI必须不包含密钥,类名称必须是"*" (星)."
根据 WinRM 实施的 WS-Management 标准,当您使用 WQL 查询过器执行编号时,资源 URI 必须广泛地针对基础类框架,而不是特定的实例或特定的类名具有特定的密钥. WinRM 严格要求 WQL 过操作时,资源 URI 必须使用星号 ( * 如果您的脚本,命令或管理软件构建一个明确命名一个类或指定实例选择器的URI,同时传输一个WQL __Filter, WinRM 客户端阻止请求并抛出这个错误.
逐步修复问题
取决于您是否通过 winrm,执行一个PowerShell cmdlet,或写一个自定义脚本,使用以下解决方案之一来解决问题.
修复1: 修复命令语法 winrm 实用性
如果您使用命令行实用程序 winrm.cmd 查询资源,确保您的 -filter 开关与一个以星号结束的资源URI相对应 ( * 没有钥匙.
- 打开 Command Prompt 或是 PowerShell 作为一个管理员.
- 检查你的原始命令.它可能看起来错误:
winrm enumerate wmicimv2/Win32_Service?Name=wuauserv -filter:"Select * from Win32_Service Where State='Running'" - 改变资源URI部分使用星号 (
*) 玩偶卡,并删除键选择器 (?Name=wuauserv修改命令以匹配这个结构:winrm enumerate wmicimv2/* -filter:"Select * from Win32_Service Where State='Running'" - 按下 Enter 为了运行正确的命令.
修复2:调整PowerShell Cmdlets ( Get-WSManInstance / Enumerate)
如果您使用原生 PowerShell WSMan cmdlets,您必须确保 -ResourceURI 参数指向方案的常识符,而不是特定的CIM类或实例键.
- 打开 PowerShell.
- 如果你的失败代码看起来像这样:
Get-WSManInstance -ResourceURI "wmicimv2/Win32_Process" -Filter "Select * From Win32_Process Where Name='notepad.exe'" - 更新
-ResourceURI论点结束时/*因此WQL引擎可以内部处理类过:Get-WSManInstance -ResourceURI "wmicimv2/*" -Filter "Select * From Win32_Process Where Name='notepad.exe'" - 执行更新的脚本.
修复3:使用替代 PowerShell Cmdlets (推)
如果您的目标只是通过 WinRM 协议远程查询 WMI / CIM 数据,则使用 CIM cmdlets 而不是原始的 WSMan 块命令更容易,更容易出现错误. CIM cmdlets 自动处理幕后的 URI 格式化.
- 打开 PowerShell.
- 取代你的复杂的WSMan编号命令,
Get-CimInstance在 WinRM 上默认运行的 cmdlet:Get-CimInstance -ClassName Win32_Service -Filter "State='Running'" -ComputerName "RemoteComputerName" - 如果您明确需要使用一个完整的WQL查询,请使用
-Query相反的参数是:Get-CimInstance -Query "Select * from Win32_Service where State='Running'" -ComputerName "RemoteComputerName" - 运行命令来获取数据,而不会触发 WinRM 语法限制.
可能有一些错误.. Learn Microsoft