工作组机器执行Get-WMIObject命令报0x80070005错误求助
嘿,这个0x80070005错误本质就是权限不足,我来帮你一步步排查解决:
确认账号权限与格式
工作组环境下,远程账号的格式要写对,应该是.\<username>(比如.\AdminUser),不然PowerShell会默认找本地机器的账号,肯定验证失败。另外,这个账号必须在远程机器的Remote Management Users组里(或者本地管理员组,不过尽量用最小权限)。你可以远程登录到目标机器,在「计算机管理」→「本地用户和组」→「组」里把账号加进去。检查凭证正确性
仔细核对<password>的拼写,包括大小写、特殊字符,别因为手输错误导致权限验证失败。可以先尝试用这个账号直接远程登录目标机器,确认账号密码能正常使用。确保远程机器的WMI服务正常运行
远程机器的Windows Management Instrumentation服务必须处于启动状态。你可以在目标机器的「服务」里查看,或者如果能基础连通的话,用这条命令验证:Get-Service Winmgmt -ComputerName "<IP address>" -Credential $remote_credential配置防火墙允许WMI通信
远程机器的Windows防火墙必须开启Windows Management Instrumentation (WMI)的入站规则。打开「Windows Defender防火墙」→「高级设置」→「入站规则」,找到这个规则并启用它,确保允许来自你本地机器的WMI请求。检查WMI命名空间权限
有时候账号有组权限,但WMI特定命名空间的权限不足。在远程机器上打开wmimgmt.msc,右键「WMI控制」→「属性」→「安全」标签,找到root\cimv2命名空间,点击「安全」→「编辑」,给你的账号添加允许的读取权限(查询服务只需要读取权限)。修正代码的小细节
你的原始代码第一行末尾少了分号,PowerShell里多行命令如果写在一行需要用分号分隔,另外加上正确的账号格式,修正后的代码如下:$wmi_pass = "<password>"; $wmi_user = ".\<username>"; $remote_pass = ConvertTo-SecureString -String $wmi_pass -AsPlainText -Force; $remote_credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $wmi_user, $remote_pass; Get-WMIObject -Query "Select DisplayName from Win32_Service where StartMode='Auto'" -ComputerName "<IP address>" -Credential $remote_credential先做基础连通性测试
先用Test-Connection "<IP address>"确认网络是通的,再用简单的WMI查询测试,比如:Get-WMIObject Win32_OperatingSystem -ComputerName "<IP address>" -Credential $remote_credential如果这个简单查询也报错,那问题大概率在权限或网络配置上;如果能成功,再回到服务查询的命令排查。
内容的提问来源于stack exchange,提问作者StackExchangeGuy

