使用 PowerShell 远程处理执行命令
使用 Windows PowerShell,有多种方法可以在本地或远程计算机上执行命令。一种方法是启用 PowerShell 远程处理并使用 PowerShell 会话命令。
本文将讨论 PowerShell 远程处理的工作原理、配置 WinRM、几个 PowerShell 会话命令示例,以及我们如何远程访问具有管理员访问权限的计算机。
什么是 PowerShell 远程处理
PowerShell Remoting(或 PSRemoting)是 PowerShell 中常用的功能之一。因此,我们可以无缝连接到一台或多台远程计算机并使用单个命令执行命令。
简而言之,PSRemoting 允许我们在远程计算机上运行命令,就像我们坐在它们面前一样。此外,PSRemoting 提供连接和验证用户、运行远程 cmdlet 并将该 cmdlet 的任何输出显示到本地计算机的功能。
将 PSRemoting 想象成 SSH 或 telnet 甚至 psexec。它只是在 PowerShell 中的计算机上运行命令的一种方式。
PSRemoting 严重依赖会话中运行的命令。会话是在内部运行命令的远程 shell。
创建这些会话之一需要在 PowerShell 控制台的后台执行许多步骤。
当我们启动 PSRemoting 会话时,会执行以下粗略步骤:
-
用户尝试在
WinRM侦听器上连接到目标服务器。WinRM侦听器是在服务器上运行的小型 Web 服务。WinRM是称为WSMan的实施标准的 Microsoft 版本。WSMan是当时由许多其他大型科技公司创建的开源标准,如英特尔、戴尔和 Sun Microsystems。 -
当客户端通过 HTTP 或 HTTPS 协议连接到侦听器时,身份验证过程开始。
-
客户端连接并验证服务器后,
PSRemoting生成会话。 -
PSRemoting生成会话后,它就开始营业了。客户端可以开始向服务器发送信息,返回任何必要的输出,称为序列化。这种通信通常是加密的。
要启用 PSRemoting,请在你的 PowerShell 控制台中键入以下命令。
Enable-PSRemoting –Force
在 PowerShell 中配置 WinRM 侦听器
客户端需要在某个地方通过网络进行连接。客户需要与对方倾听的东西交谈; 监听部分是 WinRM 监听器的角色。
你可以使用下面的 winrm 命令发现在任何 Windows 计算机上运行的所有 WinRM 侦听器。
winrm e winrm/config/listener
WinRM 侦听器有一些基本组件。
- 监听地址——他们绑定的 IP 地址。监听地址是客户端连接的服务器 IP 地址。
- 传输类型——每个
WinRM侦听器都需要一种与客户端通信的方式;他们通过使用 HTTP 或 HTTPS 的传输来做到这一点。 - 可选证书指纹——如果
WinRM侦听器使用 HTTPS 进行传输,它必须知道验证客户端的私钥是什么;此密钥是使用证书指纹找到的。
要将远程计算机添加到 WinRM 中本地计算机的受信任主机列表中,请在下面键入以下命令。
winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'
要验证和检查 WinRM 的配置,请在下面键入以下命令。
winrm quickconfig
创建新的 PowerShell 会话
New-PSSession 命令在本地或远程计算机上创建 Windows PowerShell 会话 (PSSession)。创建 PSSession 时,PowerShell 会与远程计算机建立持久连接。
我们可以在远程计算机上运行命令,而无需使用 Enter-PSSession 或 Invoke-Command 的–ComputerName 参数创建 PSSession。
当你使用 –ComputerName 参数时,PowerShell 会创建一个用于 cmdlet 的临时连接,然后关闭。
从 Windows PowerShell 6.0 开始,如果在本地计算机上启用了 SSH,并且远程计算机配置了 Windows PowerShell SSH 端点,我们可以使用安全 shell (SSH) 在远程计算机上创建和建立会话。
基于 SSH 的 Windows PowerShell 远程启动会话的好处之一是它可以跨多个平台(Windows、Linux、macOS)或跨平台工作。
对于基于 SSH 的会话,我们可以使用 -HostName 或 -SSHConnection 参数来指定远程计算机和其他相关连接信息。
New-PSSession -ComputerName DC01 -Credential (Get-Credential)
请记住,New-PSSession 命令生成的会话是持久的。这意味着我们可以多次使用它。
但是,我们必须记住,我们应该在使用 Remove-PSSession 命令后关闭会话以避免安全风险。
在 PowerShell 中使用调用方法远程运行快速命令
如果我们现在编写执行的命令,最好使用 Invoke-Command cmdlet,因为我们在 IDE 中保留了 IntelliSense。此外,如果我们运行快速、简单、一次性使用的命令,Invoke-Command 是有利的。
任何 Invoke 方法的会话都是非持久的,不会保留任何恶意用户可以滥用的会话。
下面的片段是 Invoke-Command 的示例,它传递用户名和安全字符串密码,可以在管理员级别执行命令。
脚本示例:
$username = "Username"
$password = "Password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = New-Object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
Invoke-Command -ComputerName RemoteServer -ScriptBlock {Get-Process } -Credential $cred
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn