核心概念:WinRM (Windows Remote Management)
PowerShell 远程连接的底层技术是 WinRM (Windows Remote Management),它是一个基于 Web 服务(通常使用 HTTPS)的标准协议,允许在不同的 Windows 计算机之间进行通信和管理。

在开始之前,请确保你已经理解了几个关键角色:
- 客户端:你用来发起连接并执行命令的计算机。
- 服务器端/目标端:你想要远程管理的计算机。
- 会话:在客户端和服务器端之间建立的一个持久连接,你可以在其中运行多个命令。
第一步:准备工作(服务器端配置)
在尝试连接之前,必须先在目标服务器上启用和配置 WinRM,如果这一步没做好,任何连接都会失败。
检查 WinRM 是否已启动和运行
在目标服务器上打开 PowerShell(以管理员身份运行),执行以下命令:
# 检查 WinRM 服务状态 Get-Service WinRM # 检查 WinRM 监听器 winrm e winrm/config/listener
- 期望结果:
Get-Service应该显示WinRM服务的状态为Running(运行中)。winrm e命令应该返回监听信息,通常包含一个 HTTPS 监听器,地址为 ,端口为5986。
如果服务未运行,请启动它:

Start-Service WinRM Set-Service WinRM -StartupType Automatic
配置 WinRM 监听器(最关键的一步)
默认情况下,WinRM 可能只配置为监听 HTTPS,这需要一个有效的 SSL 证书,为了简化测试和内部网络使用,我们通常会配置它也监听 HTTP。
在目标服务器上执行以下命令:
# 1. 设置 WinRM 的基本配置
winrm quickconfig
# 2. 允许 HTTP 监听(仅建议在安全的内网环境中使用)
# 这一步会创建一个 HTTP 监听器,监听在所有网络接口上,端口为 5985
winrm set winrm/config/client '@{TrustedHosts="*"}'
TrustedHosts 的重要说明:
TrustedHosts是一个安全设置,它指定了哪些客户端计算机被信任可以连接到此服务器。- 表示信任所有计算机,这在安全上非常危险,仅适用于完全受控的内网环境。
- 最佳实践:不要使用 ,而是指定客户端的计算机名或 IP 地址,如果你的客户端计算机名是
DESKTOP-ABC123,你应该使用:winrm set winrm/config/client '@{TrustedHosts="DESKTOP-ABC123"}' - 如果需要添加多个信任主机,用逗号分隔:
winrm set winrm/config/client '@{TrustedHosts="SERVER1,192.168.1.10"}'
防火墙配置
winrm quickconfig 命令通常会自动在 Windows 防火墙中创建规则,允许 5985 (HTTP) 和 5986 (HTTPS) 端口的入站连接,如果没有,你需要手动添加。

第二步:客户端连接
目标服务器已经配置好了,你可以在客户端计算机上进行连接。
使用 Enter-PSSession(交互式会话)
这种方式适合当你想直接在目标服务器上操作,就像坐在它面前一样,你输入的命令会直接在远程服务器上执行,输出也直接显示在你的本地终端。
# 基本语法 Enter-PSSession -ComputerName <服务器名或IP> -Credential <你的凭据> # 示例 Enter-PSSession -ComputerName "192.168.1.100" -Credential (Get-Credential)
-ComputerName:目标服务器的计算机名或 IP 地址。-Credential:用于身份验证的用户凭据,执行命令后,会弹出一个窗口让你输入用户名和密码,建议使用域账户或具有本地管理员权限的账户。
如何退出会话?
当你完成操作后,输入 Exit 即可返回到本地 PowerShell 会话。
# 在远程会话中输入 Exit Exit
使用 Invoke-Command(执行单条或批量命令)
这种方式非常适合在远程服务器上执行一条或一组命令,然后将结果返回到本地,它不会改变你当前所在的会话环境。
# 基本语法
Invoke-Command -ComputerName <服务器名或IP> -Credential <你的凭据> -ScriptBlock { <要执行的PowerShell命令> }
# 示例1:获取远程服务器的操作系统版本
Invoke-Command -ComputerName "192.168.1.100" -Credential (Get-Credential) -ScriptBlock {
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Caption, Version, BuildNumber
}
# 示例2:在多台服务器上执行命令
Invoke-Command -ComputerName "SRV01", "SRV02" -Credential (Get-Credential) -ScriptBlock {
Get-Service -Name "spooler"
}
优点:
- 可以一次性在多台服务器上执行相同的命令。
- 结果会整齐地返回到本地,便于处理。
第三步:使用会话(Session)
如果你需要频繁地与同一台或多台服务器交互,反复建立连接会非常低效,这时,你可以使用 New-PSSession 创建一个持久的会话对象,然后重复使用它。
创建会话
# 创建一个名为 "MyServerSession" 的会话 $session = New-PSSession -ComputerName "192.168.1.100" -Credential (Get-Credential)
使用会话执行命令
现在你可以将这个 $session 对象传递给 Invoke-Command。
# 使用已创建的会话来执行命令
Invoke-Command -Session $session -ScriptBlock {
Get-Process | Where-Object {$_.WorkingSet -gt 100MB} | Select-Object Name, WorkingSet
}
进入交互式会话(使用已创建的会话)
# 进入基于已创建会话的交互模式 Enter-PSSession -Session $session
删除会话
当你不再需要会话时,最好将其关闭以释放资源。
# 关闭并删除所有会话 Get-PSSession | Remove-PSSession # 或者删除特定的会话 Remove-PSSession -Session $session
常见问题与故障排除
连接超时或被拒绝
- 原因:最常见的原因是目标服务器的 WinRM 服务未启动或未正确配置。
- 解决方案:
- 在目标服务器上再次运行
winrm quickconfig。 - 检查
Get-Service WinRM确保服务正在运行。 - 检查
winrm e winrm/config/listener确保有监听器。 - 确认客户端的计算机名或 IP 地址已添加到目标服务器的
TrustedHosts列表中。
- 在目标服务器上再次运行
“拒绝访问” (Access is denied)
- 原因:你使用的凭据没有足够的权限。
- 解决方案:
- 确保你使用的账户是目标服务器的本地管理员组成员,或者至少是
WinRMRemoteWmiUsers__组的成员。 - 使用
Get-Credential提供正确的用户名和密码。
- 确保你使用的账户是目标服务器的本地管理员组成员,或者至少是
“无法连接到远程服务器” (Could not connect to remote server)
- 原因:网络问题、防火墙阻止或 WinRM 监听器未运行。
- 解决方案:
- 从客户端
ping目标服务器 IP,检查网络连通性。 - 确认目标服务器的防火墙已允许 5985 (HTTP) 或 5986 (HTTPS) 端口。
- 在客户端上测试 WinRM 连接:
Test-WSMan -ComputerName <目标服务器IP>,如果成功,说明基本连接是通的。
- 从客户端
HTTPS 与 HTTP 的选择
- HTTP (端口 5985):不加密,速度快,但安全性低,仅推荐在绝对安全的内网环境中使用。
- HTTPS (端口 5986):使用 SSL/TLS 加密
