Linux环境下无需WinRM通过PowerShell连接Windows获取系统信息遇阻
解决Linux上PowerShell无法使用Get-WmiObject且禁用WinRM的Windows系统信息获取问题
首先得明确:你在Linux上用的是PowerShell Core(pwsh),这个版本已经完全移除了Get-WmiObject这个cmdlet——它只存在于旧版的Windows PowerShell(powershell.exe)里。所以报错是正常的,我们需要用PowerShell Core支持的方式,同时绕开WinRM来连接Windows机器。
下面是可行的方案:利用CIM(Common Information Model)通过DCOM协议连接Windows的WMI服务,这不需要依赖WinRM。
步骤1:在目标Windows机器上做准备
首先得确保Windows端允许DCOM和WMI的访问:
- 开启DCOM:打开管理员命令提示符,执行
dcomcnfg,在组件服务里展开「计算机」→「我的电脑」,右键选择「属性」,切换到「COM安全」标签,在「启动和激活权限」里点击「编辑限制」,确保你的访问账号拥有「本地启动」和「本地激活」权限;同样在「访问权限」里设置允许对应账号的访问权限。 - 配置防火墙:打开Windows Defender防火墙,启用入站规则「Windows Management Instrumentation (DCOM-In)」和「Windows Management Instrumentation (WMI-In)」,确保这些规则允许来自Linux机器的IP访问。
- 权限确认:确保你用来连接的Windows账号拥有WMI访问权限(最简单的方式是加入本地管理员组,或者通过
wmimgmt.msc打开WMI控制,右键「本地WMI控制」→「属性」,设置对应命名空间的权限)。
步骤2:在Linux的pwsh中执行连接和查询
- 先创建凭据对象,输入Windows机器的账号密码:
$cred = Get-Credential -UserName "你的Windows账号(格式:DOMAIN\用户名或机器名\用户名)" -Message "输入Windows账号密码"
- 创建CIM会话选项,指定使用DCOM协议(绕过WinRM):
$sessionOption = New-CimSessionOption -Protocol Dcom
- 建立CIM会话:
$cimSession = New-CimSession -ComputerName "Windows机器的IP或主机名" -Credential $cred -SessionOption $sessionOption
- 查询系统信息,比如获取操作系统详情:
Get-CimInstance -CimSession $cimSession -ClassName Win32_OperatingSystem
你可以替换Win32_OperatingSystem为其他WMI类,比如Win32_ComputerSystem(硬件信息)、Win32_Process(进程列表)等。
- 用完会话记得关闭:
Remove-CimSession $cimSession
可能遇到的问题排查
- 如果连接失败,先检查Linux机器能不能ping通Windows机器,用
telnet WindowsIP 135测试135端口是否开放。 - 确认Windows的DCOM服务(
DcomLaunch)是否正常运行。 - 检查账号权限是否足够,尤其是WMI的访问权限。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

