使用 Windows PowerShell 来远程管理服务器
Contoso 的 IT 管理人员越来越重视从他们管理的对象远程执行管理任务。 他们特别感兴趣的领域之一是利用 Windows PowerShell 来远程管理 Contoso 的 IT 基础结构的能力。 可以使用 Windows PowerShell 远程处理来实现这一点。
进行远程处理的要求
远程处理要求在本地计算机上安装 Windows PowerShell,并在要连接到的任何远程计算机上启用 Windows 远程管理。 还必须启用 Windows PowerShell 远程处理。
注意
在 Windows Server 中,Windows PowerShell 远程处理默认处于启用状态,但在 Windows 10 上必须手动进行启用。
若要启用 Windows PowerShell 远程处理,请使用以下过程之一。 在已提升权限的命令提示符(或 Windows PowerShell (管理员) 提示符)处,运行以下命令:
Winrm quickconfig
或者,若要启用远程处理,可以使用以下 Windows PowerShell cmdlet:
Enable-PSremoting -force
重要
Windows 远程管理通过 HTTP 进行通信。 默认情况下,Windows 远程管理和 Windows PowerShell 远程处理为传入的未加密连接使用 TCP 端口 5985,并为传入的加密连接使用 TCP 端口 5986。
注意
使用 Windows 远程管理的应用程序(例如 Windows PowerShell)还可以将自身的加密应用于传递到 Windows 远程管理服务的数据。
运行特定命令所需的任何文件和其他资源必须位于远程计算机上,因为远程处理命令不会复制任何资源。 但是,你可以运行本地脚本。 这是因为该脚本的内容将发送到远程计算机,而不是发送到脚本文件本身。
若要执行远程管理,管理员必须有权执行以下操作:
- 连接到远程计算机
- 运行 Windows PowerShell
- 访问远程计算机上的数据存储和注册表
注意
在向公用网络位置配置文件分配了网络接口卡 (NIC) 的计算机上启用远程处理会生成错误。 可以使用 Enable-PSremoting -force
来绕过此限制,并在具有公共 NIC 的设备上强制执行远程处理。
针对远程计算机运行 cmdlet
多个 cmdlet 具有 ComputerName 参数,可让你从远程计算机中检索对象。 这些 cmdlet 不使用 Windows PowerShell 远程处理进行通信,因此你可以在运行 Windows PowerShell 的任何计算机上使用这些 cmdlet 中的 ComputerName 参数。 你不必为 Windows PowerShell 远程处理配置计算机,也不需要满足进行远程处理的系统要求。
下表提供了有关 ComputerName 参数的详细信息。
命令 | 说明 |
---|---|
Get-Command –ParameterName ComputerName |
查找使用 ComputerName 参数的 cmdlet。 |
Get-Help <cmdlet-name> -parameter ComputerName |
确定 ComputerName 参数是否需要 Windows PowerShell 远程处理。 |
处理远程命令
连接到远程计算机并向其发送远程命令时,命令将通过网络传输到远程计算机上的 Windows PowerShell 实例,然后在该计算机上运行。 命令结果会发回本地计算机,并显示在本地计算机上的 Windows PowerShell 会话中。
在将远程命令的任何本地输入发送到远程计算机之前,系统会收集该命令的所有本地输入。 但是,输出在生成后将返回本地计算机。 连接到远程计算机时,系统将使用本地计算机上的用户名和密码凭据对你向远程计算机进行身份验证。
注意
默认情况下,Kerberos 版本 5 (V5) 身份验证协议用于执行授权和身份验证。 因此,AD DS 域是必填项。
提示
如果远程计算机不在域中或在不受信任的域中,则可以通过将远程计算机定义为受信任的主机来允许客户端计算机进行连接。
以下 cmdlet 支持远程处理。
Invoke-Command
Enter-PSSession
Exit-PSSession
Disconnect-PSSession
Receive-PSSession
Connect-PSSession
提示
可以使用 Windows PowerShell ISE 创建远程选项卡。 若要执行此任务,请使用 Windows PowerShell ISE 中“文件”菜单内的“新建远程 PowerShell”选项卡选项。
实施远程处理时,可以使用临时会话连接到远程计算机,也可以创建持久性会话。
创建临时会话
对于临时会话,请启动会话,运行命令,然后结束会话。 这是运行单一命令或多个不相关的命令(即使是在大量远程计算机上)的有效方法。
注意
关闭连接后,命令中定义的变量或函数将不再可用。
若要创建临时连接,请将 Invoke-Command
与 –ComputerName 参数结合使用来指定远程计算机。 然后,使用 –ScriptBlock 参数来指定命令。 例如,以下命令在 SEA-DC1 计算机上运行 Get-EventLog
:
Invoke-Command –ComputerName SEA-DC1 –ScriptBlock {Get-EventLog –log system}
创建持久性会话
若要与另一台计算机创建持久性连接,请使用 New-PSSession
cmdlet。 例如,以下命令在远程计算机上创建会话,并将会话保存在 $s 变量中:
$s = New-PSSession –ComputerName SEA-DC1
使用 Enter-PSSession
cmdlet 来连接并启动交互式会话。 例如,在 SEA-DC1 上打开新会话后,以下命令会对该计算机启动交互式会话:
Enter-PSSession $s
输入会话后,本地计算机上的 Windows PowerShell 命令提示符将发生更改以指示该连接。
交互式会话将一直保持打开状态,直到你将其关闭。 这使你可以根据需要运行任意多个命令。 若要结束交互式会话,请输入以下命令:
Exit-PSSession
对多台计算机运行远程命令
对于临时会话,Invoke-Command
cmdlet 接受多个计算机名。 对于持久性连接,“会话”参数接受多个 Windows PowerShell 会话。 若要对多台计算机运行远程命令,请使用 cmdlet 在 ComputerName 参数中包含所有计算机名,并使用逗号分隔这些名称,如以下示例中所示:
Invoke-Command -ComputerName SEA-DC1, SEA-SVR1, SEA-SVR2 -ScriptBlock {Get-Culture}
对于永久性会话,还可以在多个 Windows PowerShell 会话中运行命令。 以下命令在 SEA-DC1、SEA-SVR1 和 SEA-SVR2 上创建 Windows PowerShell 会话,然后在每个 Windows PowerShell 会话中运行 Get-Culture
命令:
$s = New-PSSession -ComputerName SEA-DC1, SEA-SVR1, SEA-SVR2
Invoke-Command -Session $s -ScriptBlock {Get-Culture}
提示
若要将本地计算机包含在计算机列表中,请输入本地计算机的名称或一个句点 (.) 或 localhost。
如何在远程计算机上运行脚本
若要在远程计算机上运行脚本,请将 FilePath 参数与 结合使用。 以下命令在 SEA-DC1 和 SEA-SVR1 计算机上运行 Sample.ps1 脚本:
Invoke-Command -ComputerName SEA-DC1, SEA-SVR1 –FilePath C:\Test\Sample.ps1
脚本的结果返回到本地计算机。 通过使用 FilePath 参数,无需将任何文件复制到远程计算机。
演示
以下视频演示如何使用 Windows PowerShell 来管理远程 Windows Server。 此过程的主要步骤如下:
启动权限提升的 PowerShell 提示符。
通过运行以下命令创建 PowerShell 远程处理会话:
Enter-PSSession -ComputerName SEA-DC1
使用标准 Windows PowerShell cmdlet 检索有关服务器的信息,例如名称和 IP 地址。
检查 IIS 服务的状态,并使用以下命令重启该服务:
Get-Service -Name IISAdmin | Restart-Service