第20章 轻松实现远程控制
20.2 创建并使用可重用会话
会话是一个在你的PowerShell副本与远程PowerShell副本之间的持久化连接。你可以通过New-PSSession这个Cmdlet创建一个新的会话,指定一个或多个计算机名称。如果需要,你还可以指定备用用户名称、端口以及身份验证机制等。结果是一个存在PowerShell内存中的会话对象。
PS C:\>new-pssession -computername server-r2,server17,dc5
通过Get-pssession获取创建好的会话。
PS C:\> get-pssession
虽然上面的方法可以奏效,但我们更倾向于创建Session后立刻将其存入变量。例如:
PS C:\>$iis_servers = new-pssession -comp web1,web2,web3 -credential WebAdmin
请永远不要忘记这些会话会消耗资源。如果关闭Shell,那么这些会话也会随之关闭,但如果你不是频繁使用这些会话,那么即使你希望使用同一个Shell完成其他任务,手动关闭这些会话也是不错的主意。
使用Remove-PSSession这个Cmdlet关闭会话。比如说,只关闭连接到IIS的会话,可以使用下面的命令。
PS C:\>$iis_servers | remove-pssession
或者,如果希望关闭所有处于开启状态的会话,使用下面的命令。
PS C:\>get-pssession | remove-pssession
一旦成功建立会话后,你该如何使用这些会话?在接下来的几小节中,我们假设你已经创建了名称为$sessions的变量,并至少包含两个会话。我们使用localhost和Server-R2(你应该指定为符合你具体环境的计算机名称)。使用localhost并不是一个语法糖:PowerShell会开启一个真正指向本机PowerShell副本的远程会话。
20.3 利用Enter-PSSession命令使用会话
回忆第13章,Enter-PSSession命令是用于进入远程计算机一对一交互式Shell所用的命令。该命令的参数可以是一个会话对象,而不是具体的计算机名称。由于$sessions变量中包含两个会话对象,我们必须通过索引指定使用其中哪一个会话对象。
PS C:\>enter-pssession -session $sessions[0]
[server-r2]:PS C:\Users\Administrator\Document>
即使你将会话对象存于变量中,这些会话依然被存于PowerShell的一个打开会话的主列表中。这意味着你可以通过Get-PSSession访问这些会话。
PS C:\>enter-pssession -session (get-pssession -computer server-r2)
或者,下述语法也可以生效:
PS C:\>Get-PSSession -computername server-r2 | enter-pssession
20.4 利用Invoke-Command命令使用会话
Invoke-Command展示了Session对象的价值,你习惯于用该命令将一个命令(或一个完整的脚本)并行在多个远程计算机上执行。我们已经将所有的会话存储在$session变量中,我们可以通过下面的命令将多个计算机作为目标。
PS C:\>invoke-command -command { get-wmiobject -class win32_process } -session $sessions
Invoke-Command的-Session参数也可以通过括号命令提供,正如我们在之前章节对计算机名称所做的那样。举例来说,下面的语句会将命令发送给计算机名称以“loc”开头的已连接会话。
PS C:\>invoke-command -command { get-wmiobject -class win32_process } -session (get-pssession -comp loc*)
20.5 隐式远程控制:导入一个会话
隐式远程控制是对我们来说最酷、最有用的功能之一——可能是在任何操作系统的命令行界面中迄今为止最酷、最有用的功能。但不幸的是,该功能并未记入PowerShell文档。所幸,我们在本文中对该功能进行了阐述。
让我们通过一个示例来查看完整的过程。
PS C:\> $session = new-pssession -comp server-r2 #establishes connection
PS C:\> invoke-command -command
{ import-module activedirectory } -session $session #载入远程控制模块
PS C:\>import-pssession -session $session -module activedirectory -prefix rem #Impors remote commands
下面是本示例的解释。
(1)首先,通过与一台装有活动目录模块的远程计算机建立一个会话。我们需要该计算机装有PowerShell v2或更新版本,我们必须启用该计算机的远程控制。
(2)我们告诉远程计算机导入其本地的活动目录模块。
(3)我们接下来告诉我们的计算机从远程会话中导入命令。
(4)PowerShell在本地计算机创建一个临时模块,用于代表远程命令。这些命令并不是被复制过来的;PowerShell为其创建了指向远程计算机的快捷方式。
现在我们就可以运行活动目录模块的命令了,甚至是使用帮助命令。我们使用New-remADUser来代替New-ADUser,这是由于我们在命令的名词部分添加了前缀“rem”。该命令在我们关闭Shell或关闭与远程连接的会话之前一直存在。
20.6 使用断开会话
PowerShell v3对远程控制引入了两项提升。
首先,会话不再那么脆弱,意思是在网络闪断或其他传输中断的情况下,会话不会断开。
在第3版中,你必须显式使用的一项功能:断开会话。比如你正在以用户Admin1(是Domain Admins组成员)的身份连接到名称为Computer1的计算机上,并创建一个连接到名称为COMPUTER2的连接。
PS C:\>New-PSSession -ComputerName COMPUTER2
然后你就可以关闭连接。该操作仍然是在Computer1上进行的。当你完成操作后,它会将两台计算机之间的连接断开,但会在Computer2上保留一份PowerShell的副本。注意,你可以通过指定Session的ID号完成该操作,该ID号会在你第一次创建Session时显示。
PS C:\>Disconnection-PSSession -Id 4
但最酷的地方在于,我们登录到另一台计算机,也就是COMPUTER3上,用同样的域帐号Admin1,并获取运行在COMPUTER2上的会话列表。
我们花一些时间讨论和管理这些会话。在PowerShell的WSMAN:Drive,你可以发现大量帮助你管控已断开会话的设置。你还可以通过组策略对大多数配置进行中心化管理。需要寻找的关键设置如下。
- -IdleTimeout 指定当远程PowerShell中没有用户活动时,远程Shell将保持打开状态的的最长时间。
- -MaxConcurrentUsers 指定可以在同一计算机上通过远程Shell同时执行远程操作的最大用户数。
- -MaxShellRunTime 指定会话可以打开的最长时间。
- -MaxShellPerUser 指定任何用户可以在同一系统上远程打开的并发Shell的最大数目。