核心方法概览
Enter-PSSession(交互式会话):像远程桌面一样,你会在本地 PowerShell 窗口中直接操作远程服务器的命令行,适用于需要长时间、多步骤的交互式管理任务。Invoke-Command(远程执行命令):这是最灵活、最强大的方法,你可以在本地编写一个或多个命令,然后将它们发送到远程服务器执行,并将结果返回本地,非常适合执行单个命令或脚本块。- WinRM (Windows 远程管理):这是 PowerShell 远程连接的底层协议,理解并配置 WinRM 是成功连接的关键,尤其是在跨网络或不同版本 Windows 系统之间时。
- 其他方法:如
plink(PuTTY) 或 SSH,这些是更通用的工具,但不是 PowerShell 的原生方式。
Enter-PSSession - 交互式会话
当你需要进入远程服务器,像坐在它面前一样操作时,这个命令非常方便。

基本语法
Enter-PSSession -ComputerName <服务器名或IP> -Credential <你的用户名>
详细步骤
第1步:准备工作 (在远程服务器上)
确保远程服务器上的 WinRM 服务已启动并配置正确,在大多数现代 Windows Server (2012+) 和 Windows 10/11 系统上,这通常是默认开启的,你可以通过在远程服务器上运行以下命令来检查和配置:
# 检查 WinRM 服务状态,应为 "Running" Get-Service WinRM # 如果未运行,可以启动并设置为自动启动 Set-Service -Name WinRM -StartupType 'Automatic' Start-Service -Name WinRM # 测试监听器 winrm enumerate winrm/config/listener
第2步:在本地客户端连接
- 打开一个 PowerShell 窗口。
- 使用
Enter-PSSession命令。
示例:

# 连接到名为 "SRV01" 的服务器 Enter-PSSession -ComputerName SRV01 -Credential (Get-Credential)
- 运行此命令后,系统会弹出一个窗口,提示你输入用户名和密码。
- 输入具有管理员权限(或足够权限)的账户信息后,你的 PowerShell 提示符会改变,通常显示
[SRV01]: PS C:\Users\YourUser\Documents>。 - 现在你输入的所有命令都将在远程服务器
SRV01上执行。 - 完成后,输入
Exit即可返回本地会话。
Invoke-Command - 远程执行命令
这是最常用和推荐的方法,特别是对于自动化任务,它更轻量,不会占用一个持续的会话。
基本语法
Invoke-Command -ComputerName <服务器名或IP> -Credential <你的用户名> -ScriptBlock { <要执行的PowerShell代码> }
详细步骤
第1步:准备工作 (同上) 确保远程服务器的 WinRM 已正确配置。
第2步:在本地客户端执行命令
示例1:执行单个命令
# 获取远程服务器的操作系统版本信息
Invoke-Command -ComputerName SRV01 -Credential (Get-Credential) -ScriptBlock { Get-ComputerInfo | Select-Object WindowsProductName, OsVersion }
示例2:执行多个命令或复杂脚本
使用 & 符号可以在一个 ScriptBlock 中执行多个命令。
Invoke-Command -ComputerName SRV01 -Credential (Get-Credential) -ScriptBlock {
# 停止 IIS 网站
Stop-Website -Name "Default Web Site"
# 创建一个备份文件夹
$backupPath = "C:\Backup\$(Get-Date -Format 'yyyyMMdd')"
New-Item -ItemType Directory -Path $backupPath -Force
Write-Host "备份文件夹已创建在: $backupPath"
}
示例3:从本地文件执行脚本
这是 Invoke-Command 的一个强大功能,你可以将本地的 .ps1 脚本文件发送到远程服务器执行。
# 假设你本地有一个名为 C:\Scripts\Get-LogSize.ps1 的脚本 $scriptPath = "C:\Scripts\Get-LogSize.ps1" Invoke-Command -ComputerName SRV01 -Credential (Get-Credential) -FilePath $scriptPath
示例4:使用会话 (Session) 提高性能
如果需要对同一台服务器执行多次命令,创建一个会话可以大大提高效率,因为它避免了每次都建立新的连接。
# 1. 创建一个会话
$session = New-PSSession -ComputerName SRV01 -Credential (Get-Credential)
# 2. 使用这个会话执行多个命令
Invoke-Command -Session $session -ScriptBlock { Get-Process | Where-Object {$_.CPU -gt 10} }
Invoke-Command -Session $session -ScriptBlock { Get-Service | Where-Object {$_.Status -eq 'Running'} }
# 3. 任务完成后,移除会话
Remove-PSSession -Session $session
配置 WinRM (关键步骤)
如果连接失败,90% 的问题是 WinRM 配置不正确。
在远程服务器上启用 WinRM
以管理员身份在远程服务器的 PowerShell 中运行:
# 设置 WinRM 监听器,使用 HTTPS 更安全(需要配置证书) # WinRM quickconfig # 如果只是内网测试,可以使用 HTTP winrm quickconfig -force
运行后,它会提示你设置防火墙规则,选择 Y (是) 即可。
配置信任的主机
如果你的客户端不在远程服务器的“受信任的主机”列表中,连接可能会被策略阻止,在客户端的 PowerShell 中执行以下命令:
# 将远程服务器 IP 或主机名添加到受信任主机列表 # 注意:使用 * 会信任所有主机,存在安全风险,仅限测试环境使用。 Set-Item WSMan:\localhost\Client\TrustedHosts -Value "SRV01,192.168.1.100" -Force
- 要恢复默认设置,可以运行:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "" -Force
使用 SSH (现代替代方案)
从 PowerShell 6+ 开始,官方支持通过 SSH 进行远程连接,这比 WinRM 更通用,也更容易在 Linux 和 Windows 之间互通。
前提条件
- 在客户端和服务器上都安装了 PowerShell 7+。
- 在客户端和服务器上都安装了 OpenSSH。
- 在服务器上已配置好 SSH 服务,并允许密码或密钥认证。
连接步骤
-
在服务器上设置 PowerShell 为 SSH 的子系统。 编辑服务器的 SSH 配置文件 (
C:\ProgramData\ssh\sshd_config),确保有以下行(去掉 注释):Subsystem powershell C:/Program Files/PowerShell/7/pwsh.exe -sshs -NoLogo -NoProfile然后重启 SSH 服务:
Restart-Service sshd。 -
在客户端使用
Enter-PSSession连接# -KeyFilePath 指定你的 SSH 私钥文件路径 Enter-PSSession -HostName SRV01 -UserName Administrator -KeyFilePath C:\Users\YourUser\.ssh\id_rsa
如果使用密码认证:
Enter-PSSession -HostName SRV01 -UserName Administrator
-
在客户端使用
Invoke-Command连接Invoke-Command -HostName SRV01 -UserName Administrator -ScriptBlock { Get-Process }
总结与对比
| 特性 | Enter-PSSession (WinRM) |
Invoke-Command (WinRM) |
Enter-PSSession (SSH) |
|---|---|---|---|
| 用途 | 交互式、长时间操作 | 自动化、一次性或多次命令 | 交互式或自动化 |
| 会话类型 | 持续的交互式会话 | 无状态或使用会话 | 持续的交互式会话 |
| 灵活性 | 较低 | 极高 | 高 |
| 协议 | WinRM | WinRM | SSH |
| 跨平台 | 仅限 Windows | 仅限 Windows | Windows, Linux, macOS |
| 推荐场景 | 需要手动排错、探索服务器 | 脚本自动化、批量管理 | � |
