Windows Server 2025 / 如何通过 WinRM 使用 PowerShell 远程管理

PowerShell 远程管理可将命令发送到另一台服务器,或在那里打开交互式控制台。在 Windows Server 2025 上使用 Enter-PSSession 或 Invoke-Command 前,应先检查 Windows 远程管理(WinRM,Windows Remote Management)服务、会话端点和身份验证条件。

区分服务器配置与客户端连接

在 FS1 控制台配置连接接收功能,在管理电脑运行连接命令。颠倒位置可能打开不必要的侦听器,或查询错误的电脑。本步骤使用 Windows PowerShell 5.1 与 WinRM,不使用 SSH(Secure Shell)传输。请按区段交互执行,不要将所有代码块合成一个脚本直接运行。

  • 确认 FS1 及可用于该服务器的有效管理员账户。
  • 使用为实验准备的隔离管理网络。
  • 保留 FS1 控制台访问,以便检查状态和恢复连接。

在 FS1 上以管理员身份打开 Windows PowerShell,并记录初始状态;远程管理可能已经配置。Get-Service 查看服务状态,Get-PSSessionConfiguration 列出会话端点,Test-WSMan localhost 检查本地 WinRM 响应。配置正常时,应能看到 WinRM 状态为 Running、可用的会话配置,以及 WS-Management 响应而非错误。本地检查不能证明客户端能够访问,更不能证明客户端有权执行命令:

Get-Service WinRM
Get-PSSessionConfiguration
Test-WSMan localhost

仅在必要时配置服务器

尚未配置远程接收时,先在 FS1 控制台用 hostname 核对电脑,再运行 Enable-PSRemoting。该命令可能启动或重启 WinRM、创建侦听器、启用会话配置并修改防火墙规则。-Force 会省略确认提示,不能代替管理员权限,也不能避免在错误电脑上执行的影响。仅发送命令的管理电脑不需要为此启用远程接收。

hostname
Enable-PSRemoting -Force
Test-WSMan localhost

将来源限制为必要的管理电脑或管理子网。在 wf.msc → 入站规则中检查 WinRM 规则的活动配置文件、端口和远程地址,也要检查是否存在范围更大的其他允许规则。不要通过关闭防火墙或随意更改网络配置文件来解决错误。WinRM 默认使用 TCP 5985 进行 HTTP 通信,使用 TCP 5986 进行 HTTPS 通信。

存在 HTTP 侦听器,不等于已身份验证的消息没有保护。使用 Kerberos 或 NTLM(NT LAN Manager)时,WinRM 在身份验证后加密消息;HTTPS 还保护传输,并要求正确配置和验证证书。服务器身份验证仍是另一项检查。设计连接前,请阅读 WinRM 身份验证与消息安全说明。

域已正常运行时使用服务器名称

此路径要求管理电脑和 FS1 已加入同一域,域名系统(DNS,Domain Name System)及时间同步正常,且账户具有相应权限。域尚未配置时,不应期待连接成功。Enter-PSSession 会打开交互式会话:执行连接后,等待提示符显示目标服务器,再逐一输入 hostname、whoami 和 Exit-PSSession。

Test-WSMan -ComputerName 'fs1.ad.example.test'
Enter-PSSession -ComputerName 'fs1.ad.example.test'
hostname
whoami
Exit-PSSession

连接成功后,hostname 应显示 FS1,whoami 应显示预期用户身份。Exit-PSSession 返回管理电脑。域 DNS 可用时应使用完全限定域名(FQDN,Fully Qualified Domain Name);IP 地址不会使用与服务器名称相同的 Kerberos 身份验证方式。

在工作组路径中限制信任列表范围

工作组或 IP 连接需要额外条件:正确配置的 HTTPS 或特定 TrustedHosts 条目,以及显式提供的凭据。远程连接故障排除指南说明了这些要求。TrustedHosts 只是抑制身份核验错误,并不会验证服务器身份。实际运维可考虑使用可信证书的 HTTPS,同时遵守组织的身份验证策略。

在隔离实验中,先从 FS1 控制台核实实际 IP。随后在管理电脑上以管理员身份打开 Windows PowerShell,并确认 WinRM 可用于访问 WSMan:。示例保存原列表并添加一个目标;原来已有的通配符仍然有效。修改前应检查初始值,因为 TrustedHosts 会影响管理电脑上的所有用户。不要将列表改为匹配所有主机的通配符。

将示例中的 FS1\Administrator 换为 FS1 上实际使用的管理员账户,且密码不能为空。Windows PowerShell 5.1 中,带 -UserName 的 Get-Credential 可能先要求填写必需的 Message 参数;此处填写请求说明,不是密码。随后再在凭据提示中输入实际凭据。交互执行 Enter-PSSession,进入后检查 hostname,再用 Exit-PSSession 返回。

$previousHosts = (Get-Item WSMan:\localhost\Client\TrustedHosts).Value
$labTargets = (@($previousHosts -split ',') + '172.24.50.20' | Where-Object { $_ } | Sort-Object -Unique) -join ','
Set-Item WSMan:\localhost\Client\TrustedHosts -Value $labTargets
$labCredential = Get-Credential -UserName 'FS1\Administrator'
Enter-PSSession -ComputerName '172.24.50.20' -Credential $labCredential
hostname
Exit-PSSession

自行创建的本地管理员账户可能受到用户账户控制(UAC,User Account Control)的远程限制。应检查身份验证设计与权限,不要一概禁用这些保护。返回管理电脑后,在保存 $previousHosts 的同一个本地 PowerShell 窗口中恢复原值。恢复前确认没有其他人随后添加、需要保留的更改;如果窗口已关闭、变量已丢失,不要假设原列表为空而直接恢复:

if ([string]::IsNullOrEmpty($previousHosts)) {
    Clear-Item WSMan:\localhost\Client\TrustedHosts
} else {
    Set-Item WSMan:\localhost\Client\TrustedHosts -Value $previousHosts
}

执行单次远程查询并核对结果来源

域环境满足条件后,在管理电脑运行下列查询,获取 FS1 的操作系统信息,无须进入交互式控制台:

Invoke-Command -ComputerName 'fs1.ad.example.test' -ScriptBlock {
    Get-CimInstance Win32_OperatingSystem | Select-Object Caption,Version,LastBootUpTime
}

检查返回的 PSComputerName,以及 Caption、Version、LastBootUpTime 值,确认查询的是预期服务器,不要把本地结果当成远程结果。分别检查 DNS、端口可达性、WinRM 响应、身份验证和会话授权;Test-WSMan 有响应不代表有权执行命令。撤销侦听器或服务更改之前,应检查其他工具的依赖,并与初始状态比较。