启用 PSRemoting:本地和远程技术

虽然在Windows上,默认情况下启用了PSRemoting,但并不总是启用的。如果您需要测试是否已启用PSRemoting,或者在Windows上启用PSRemoting,本教程适合您。

本教程将引导您了解在运行Windows的本地和远程计算机上启用PSRemoting的许多不同方法。

让我们开始吧!

启用PSRemoting有很多作用

如果您第一次了解PowerShell Remoting,您可能会认为启用只是一个命令。也许您看到了一些关于Enable-PSRemoting PowerShell命令的引用,并认为一旦运行该命令,它就会在某个地方切换一下。您是错误的。

当您听说启用PSRemoting时,必须在后台执行许多任务才能实现。由于PowerShell Remoting依赖其他系统来正确运行,因此它有一些依赖项。

例如,在Windows上,当您使用没有参数的Enable-PSRemoting命令时,它将执行以下所有任务:

  1. 启动WinRM服务并设置为自动启动。
  2. 在默认的WinRM端口5985上创建一个侦听器,用于HTTP流量。
  3. 启用WS-Management的防火墙例外。
  4. 使用WS-Management注册PowerShell会话配置。
  5. 启用PowerShell会话配置。
  6. 将 PowerShell 远程会话设置为允许远程访问。
  7. 重新启动 WinRM 服务器以应用所有更改。

你难道不高兴你不必手动完成所有这些步骤吗?为什么要提到这个,如果 Enable-PSRemoting 命令已经完成了所有操作?因为有时候会出现问题,你需要排除故障。

Windows 上的默认 PSRemoting 设置

由于 PSRemoting 是在 Windows 中诞生的,它默认是启用的,但并非普遍适用,也不适用于所有 Windows 操作系统版本。

在所有 Windows 客户端操作系统上,PSRemoting 总是被禁用的。

在 Windows Server 上,PSRemoting 有时是启用的,但并非始终如此,这取决于 Windows 所在的网络配置文件。下面你将找到一个方便的表格,帮助你确定你的 Windows 操作系统是否启用了 PSRemoting。

Operating System Network Profile PSRemoting
Windows Server 2008 R2 Domain/Private Disabled
Windows Server 2008 R2 Public Disabled
Windows Server 2012 & Newer Domain/Private Enabled
Windows Server 2012 & Newer Public Enabled within the same subnet

另一方面,Linux 则更简单。PSRemoting 甚至不存在!甚至 PowerShell 默认也未安装。如果你想在 Linux 上运行 PSRemoting,你需要自行设置。

说了这么多,让我们来演示如何实际使用 PSRemoting 吧!

先决条件

如果你打算跟着本节的示例操作,请确保你具备以下条件:

  • A Windows Server 2008 R2 or later machine
  • A local or Active Directory domain user in the local administrators group

在本地启用 PSRemoting

启用 PSRemoting 的最简单方法之一是使用内置的 Enable-PSRemoting 命令。 正如你上面学到的那样,该命令是配置许多不同服务以适应 PowerShell 远程操作的快捷方式。

使用 Enable-PSRemoting Cmdlet

当您在不带任何参数的情况下运行此命令时,它将根据您正在运行的操作系统执行不同的操作。 在任何当前的 Windows 操作系统上,都会执行相同的基本步骤。 启用 PSRemoting,创建 WinRM HTTP 监听器,并启用防火墙规则。 关键区别在于处理公共网络的方式。

在服务器操作系统上,如 Windows Server 2019,公共网络的防火墙规则允许来自同一网络上其他设备的远程连接。 在客户端操作系统上,如 Windows 10,您将收到一条错误消息,指出您是公共网络。

如果您不确定 Windows 正在运行哪个网络配置文件,请运行以下命令:

Get-NetConnectionProfile

您应仅在受信任的网络上使用 PSRemoting,因为它本质上是在运行一个 Web 服务器以侦听远程连接。

Get-NetConnectionProfile

如果您愿意在除 私人 之外的网络配置文件上运行 PSRemoting,则可以通过使用 SkipNetworkProfileCheck 参数跳过网络配置文件检查。 使用此参数将在 Windows 防火墙上打开 WinRM 端口。

Enable-PSRemoting -SkipNetworkProfileCheck

使用 SkipNetworkProfileCheck 参数将为您当前的网络配置文件打开 Windows 防火墙,但仅允许来自相同子网上的计算机的远程连接。

Enable-PSRemoting命令可以与两个参数一起使用,它们是-Force-Confirm参数。您可以使用-Force跳过运行Enable-PSRemoting命令时通常会提示您的所有提示。您还可以使用-Confirm:$false来获得相同的结果。

使用winrm quickconfig命令

winrm quickconfig命令曾经是设置PSRemoting的流行方式,但在创建Enable-PSRemoting cmdlet之前,它仍然有其作用。如果您只运行winrm quickconfig,它将启用WinRM服务,创建一个HTTP监听器,并启用防火墙规则。这些都是Enable-PSRemoting已经完成的工作,但这并不会设置机器以处理远程PowerShell会话。

winrm命令的便利之处在于设置HTTPS监听器。虽然您可以手动执行此操作,但如果对于HTTPS监听器有适当的证书,则可以简单地运行winrm quickconfig -transport:https,即可配置HTTPS监听器和HTTPS防火墙规则。

远程启用PSRemoting

到目前为止,您已经学会了可以通过在本地计算机上运行命令来启用PSRemoting。这带来了一个鸡和蛋的问题。PSRemoting允许您在远程计算机上运行命令,但是如何在没有PSRemoting的情况下远程运行命令?没有 PSRemoting?

有三种方法:使用PSexec实用程序、WMI和组策略

使用Psexec

PSExec是一个方便的实用工具,允许您像PSRemoting一样运行远程命令。然而,PSexec使用一种不同的通信方法,您可以利用它的优势!

使用PSexec,您可以使用以下命令从本地计算机运行Enable-PSRemoting。下面的命令调用psexec并连接到ServerB服务器。然后,它启动一个PowerShell进程并使用-Force开关执行Enable-PSRemoting命令,以跳过通常的提示。

.\psexec.exe \ServerB -h -s powershell.exe Enable-PSRemoting -Force

此选项适用于偶尔需要在远程系统上启用PSRemoting的情况,但不适用于需要在许多系统上启用PSRemoting的情况,并且需要您下载psexec。

使用WMI

有时PSexec不起作用。许多安全软件阻止psexec,但不要担心,您还可以使用WMI!

使用PowerShell和Invoke-CimMethod cmdlet。使用Invoke-CimMethod cmdlet,您可以指示PowerShell通过DCOM连接到远程计算机并调用方法。

幸运的是,WMI有一个Win32_Process类,允许您调用进程。通过针对Win32_Process调用Create方法,Invoke-CimMethod连接到远程计算机,调用PowerShell并运行Enable-PSRemoting,如下所示。

以下示例正在为会话连接创建哈希表,其中指定了服务器名称、凭据和协议。然后在以下哈希表中,正在设置Invoke-CimMethod的参数。一旦这些被运行,就会在DCOM协议上创建一个CIM会话,该会话启动一个PowerShell进程,然后运行Enable-PSRemoting命令。

$SessionArgs = @{
     ComputerName  = 'ServerB'
     Credential    = Get-Credential
     SessionOption = New-CimSessionOption -Protocol Dcom
 }
 $MethodArgs = @{
     ClassName     = 'Win32_Process'
     MethodName    = 'Create'
     CimSession    = New-CimSession @SessionArgs
     Arguments     = @{
         CommandLine = "powershell Start-Process powershell -ArgumentList 'Enable-PSRemoting -Force'"
     }
 }
 Invoke-CimMethod @MethodArgs

在这种情况下,如果您在域环境中使用,并且执行命令的用户在目标服务器上具有管理员权限,则可以排除Credential = Get-Credential行。

使用组策略

最后,也可以说是启用WinRM跨多台计算机的最佳选项之一是通过组策略。使用组策略时,您可以创建一个单一的组策略对象,并将该策略一次应用到数千台计算机上。

所有计算机必须在Active Directory域中才能使用组策略。

要一次性使用组策略启用许多计算机上的WinRM,您需要设置三个不同的配置项:

  1. 启用WinRM服务。
  2. 打开WinRm的Windows防火墙端口。
  3. 创建WinRM侦听器并允许连接到它。

首先,RDP到域控制器,或者更好的办法是在域加入的工作站上安装远程服务器管理工具(RSAT)包。现在,你应该有了组策略管理控制台(GPMC)

。启用WinRM服务

为了在所有目标计算机上启用WinRM服务:

  1. 打开GPMC并创建一个GPO。在新的GPO中,导航到计算机配置 —> Windows设置 —> 安全设置 —> 系统服务
  2. 选择Windows远程管理(WS-Management)
  3. 在配置面板中选中定义此策略设置的复选框。
  4. 选择自动的单选按钮,以在启动时自动启动WinRM服务。
  5. 单击确定以确认设置。

打开Windows防火墙端口

接下来,你需要在所有目标计算机上打开WinRM端口。在仍然编辑上面创建的GPO时:

  1. 导航到计算机配置 —> Windows设置 —> 安全设置 —> 带高级安全性的Windows Defender防火墙。

2. 单击新入站规则以创建新的入站规则。

3. 在第一页上选择预定义,然后如下所示选择Windows远程管理

Windows Remote Management

4. 在接下来的页面上,除非您知道在您的环境中使用的是公共网络并且需要允许从它们进行远程连接,否则选中域/专用网络规则的复选框。

Domain/Private network rule

5. 在接下来的页面上保留允许连接的默认设置,然后单击“完成”以创建规则。

创建WinRM侦听器和过滤器列表

要添加到您的GPO中的最终配置项目是创建WinRM侦听器并允许连接到该WinRM侦听器。此设置为HTTP创建WinRM侦听器并允许从指定的IP或IP范围进行连接。

仍在编辑WinRM GPO时:

  1. 导航至计算机配置 —> 管理模板 —> Windows组件 —> Windows远程管理(WinRM) —> WinRM服务

2. 为通过WinRM允许远程服务管理设置选择已启用

3. 在通过WinRM允许远程服务器管理设置下,分别为IPv4过滤器IPv6过滤器提供星号(*),如下所示。

请注意,在每个过滤器列表中,如果您事先知道将连接到所有目标计算机的主机,则可以用逗号分隔多个主机。

Allow remote server management through WinRM

4. 点击确定以确认最新的 GPO 设置。

应用 GPO

此时,GPO 应该已经创建并准备就绪。您现在需要做的最后一项任务是将此 GPO 应用到您希望在其上启用 WinRM 的所有目标计算机上。您将不会在本教程中学习如何将 GPO 分配给目标计算机。

如果您不知道如何将 GPO 分配给 Active Directory 中的一组计算机,您应该查看这篇文章

下一步

在本教程中,您已经学会了多种启用 PSRemoting 的方法。您如何启用 PSRemoting 将在很大程度上取决于您的环境,我希望我在这里涵盖了您的情况。

现在,将您所学到的知识付诸实践,开始在您的环境中使用 PSRemoting 吧!

Source:
https://adamtheautomator.com/enable-psremoting/