Windows PowerShell:隐式远程处理

Don Jones

Windows PowerShell 2.0 中有一个鲜有人知的功能,可以轻松为您的环境增加难以置信的灵活性。假设您的客户端计算机主要运行 Windows XP – 目前来说这仍是一种常见情形。您的域控制器使用 Windows Server 2003。

您可以将 Windows PowerShell 2.0 用于这两种操作系统,但是可能无法使用某些较新的 Windows PowerShell cmdlet 模块,例如 Windows Server 2008 R2 附带的 Active Directory 模块。这些模块在早期版本的 Windows 上无法运行。

这不是个问题。您只需在环境中的一台计算机上安装 Windows 7 或 Windows Server 2008 R2 即可(Active Directory 模块在这两种操作系统上都可以运行)。例如,您可以安装单个 Windows Server 2008 R2 域控制器,因为这会为您提供 Active Directory 模块以及与该模块进行通信的 Active Directory 管理网关服务。下载网关服务并将其安装在 Windows Server 2008 和 Windows Server 2003 上。

通过在 Windows PowerShell 中运行 Enable-PSRemoting,在新的域控制器上启用远程处理和 WinRM。然后,在您的 Windows XP 客户端计算机上启动 Windows PowerShell 2.0,准备创造奇迹吧。

构建模块

先与新的域控制器建立一个远程会话:

$session = New-PSSession -computerName my-new-dc

当然要提供正确的计算机名称来代替“my-new-dc”。您可以指定更多参数,例如备用凭据或者备用 WinRM 端口。运行 help new-pssession 以了解详细信息。

接下来,命令该远程 Windows PowerShell 实例下载 Active Directory cmdlet:

Invoke-command { import-module activedirectory } -session $session

巧妙之处在于:在您的客户端计算机上,让本地 Windows PowerShell 实例通过远程会话将 Active Directory cmdlet 导出到某个本地模块:

Export-PSSession -session $session -commandname *-AD* -outputmodule RemAD -allowclobber

此命令将创建一个新的 Windows PowerShell 模块,存储在 WindowsPowerShell\Modules\RemAD 目录下的 Documents 文件夹中。只有名称符合“*-AD*”模式的 cmdlet 才会包含在内。大多数附加 cmdlet 在名称中使用“AD”之类的前缀,主要就是由于这个原因。因为这样就可以更容易地区分出这些 cmdlet。

cmdlet 实际上不会复制到您本地的计算机上。相反,本地创建的模块将用作一种快捷方式。cmdlet 将始终在远程域控制器上运行,但是看起来像是在本地运行。

使用 cmdlet

先删除与远程域控制器之间的会话:

Remove-PSSession -session $session

然后下载新模块:

Import-Module RemAD -prefix Rem

此命令会将新模块加载到内存中,并为该模块中每个 cmdlet 的名称附加“Rem”前缀。该前缀可以提醒您,这些 cmdlet 将在远程运行。您可以选择自己喜欢的任何前缀,我通常会使用“R”或“Rem”之类的字符串来表示“远程”。

尝试获取有关远程 cmdlet 的帮助:

Help New-RemADUser

您将看到一条错误,因为目前尚未在您的计算机与这些 cmdlet 所在的域控制器之间建立远程会话。您无需显式启动该会话,而可以通过执行某个远程 cmdlet 来隐式 完成此任务:

Get-RemADUser -filter "Name -like 'D*'"

这将重新实例化与域控制器之间的远程连接,提交要执行的命令,并且在域控制器上执行命令。随后,每个名称以“D”开头的用户都将被序列化到 XML 中,并在通过网络传输到您的计算机上。在您的计算机上,这些用户将被反序列化为可以在 Windows PowerShell 管道中使用的对象。此时您就可以获取帮助了,因为远程会话已经建立:

Help New-RemADUser

该会话将保持活动状态,直到您关闭 Shell 实例或删除模块为止:

Remove-Module RemAD

访问和管理

借助隐式远程处理,可以更方便地使用仅在远程计算机上提供的 cmdlet。经过隐式远程处理的 cmdlet 的运行方式与安装在本地的情形几乎没有区别。因此您随时可以根据需要使用它们。由于远程会话几乎不需要在本地计算机和远程计算机上占用任何资源,因此这是一种非常实用的计算能力分配方式。

Don Jones 是 Concentrated Technology 的创始人,他会在 ConcentratedTech.com 解答有关 Windows PowerShell 和其他技术的问题。他还是 Nexus.Realtimepublishers.com 的撰稿人,并且他的许多著作还在此网站上以电子版的形式免费提供。

相关内容