凌峰创科服务平台

PowerShell远程连接服务器,如何配置与操作?

核心概念:WinRM (Windows Remote Management)

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

PowerShell远程连接服务器,如何配置与操作?-图1
(图片来源网络,侵删)

在开始之前,请确保你已经理解了几个关键角色:

  • 客户端:你用来发起连接并执行命令的计算机。
  • 服务器端/目标端:你想要远程管理的计算机。
  • 会话:在客户端和服务器端之间建立的一个持久连接,你可以在其中运行多个命令。

第一步:准备工作(服务器端配置)

在尝试连接之前,必须先在目标服务器上启用和配置 WinRM,如果这一步没做好,任何连接都会失败。

检查 WinRM 是否已启动和运行

在目标服务器上打开 PowerShell(以管理员身份运行),执行以下命令:

# 检查 WinRM 服务状态
Get-Service WinRM
# 检查 WinRM 监听器
winrm e winrm/config/listener
  • 期望结果
    • Get-Service 应该显示 WinRM 服务的状态为 Running(运行中)。
    • winrm e 命令应该返回监听信息,通常包含一个 HTTPS 监听器,地址为 ,端口为 5986

如果服务未运行,请启动它:

PowerShell远程连接服务器,如何配置与操作?-图2
(图片来源网络,侵删)
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) 端口的入站连接,如果没有,你需要手动添加。

PowerShell远程连接服务器,如何配置与操作?-图3
(图片来源网络,侵删)

第二步:客户端连接

目标服务器已经配置好了,你可以在客户端计算机上进行连接。

使用 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 服务未启动或未正确配置。
  • 解决方案
    1. 在目标服务器上再次运行 winrm quickconfig
    2. 检查 Get-Service WinRM 确保服务正在运行。
    3. 检查 winrm e winrm/config/listener 确保有监听器。
    4. 确认客户端的计算机名或 IP 地址已添加到目标服务器的 TrustedHosts 列表中。

“拒绝访问” (Access is denied)

  • 原因:你使用的凭据没有足够的权限。
  • 解决方案
    1. 确保你使用的账户是目标服务器的本地管理员组成员,或者至少是 WinRMRemoteWmiUsers__ 组的成员。
    2. 使用 Get-Credential 提供正确的用户名和密码。

“无法连接到远程服务器” (Could not connect to remote server)

  • 原因:网络问题、防火墙阻止或 WinRM 监听器未运行。
  • 解决方案
    1. 从客户端 ping 目标服务器 IP,检查网络连通性。
    2. 确认目标服务器的防火墙已允许 5985 (HTTP) 或 5986 (HTTPS) 端口。
    3. 在客户端上测试 WinRM 连接:Test-WSMan -ComputerName <目标服务器IP>,如果成功,说明基本连接是通的。

HTTPS 与 HTTP 的选择

  • HTTP (端口 5985):不加密,速度快,但安全性低,仅推荐在绝对安全的内网环境中使用。
  • HTTPS (端口 5986):使用 SSL/TLS 加密
分享:
扫描分享到社交APP
上一篇
下一篇