Windows PowerShell远程管理 2.0 版快速浏览

Don Jones

此专栏基于 Windows PowerShell 的预发布版本。文中包含的所有信息均有可能发生变更。

目录

两种远程作业类型
同步与异步
可重用的运行空间
扇入远程作业
2.0 中的杀手级应用程序

您有没有体验过 Windows PowerShell 2.0 的最新社区技术预览版 (CTP)?最新版本的 CTP2 进一步改进了远程管理,现在是开始熟悉它所提供的新功能的绝佳时机。在开始介绍之前,您应花点时间

把它下载下来,网址为:go.microsoft.com/fwlink/?LinkID=119707

首先,我要澄清几个要点。CTP 是 Microsoft 提供的预测试版的代码,旨在让像我一样迫不及待的用户了解 Microsoft 下一版本应用程序的发展方向。每个 CTP 里程碑或最终产品(业界都这样称呼它)可能与之前的最终产品完全不同。这是因为开发团队会收集反馈并仔细研究,然后根据这些反馈对应用程序进行改动。该方法为使用 CTP 带来了一个明显的好处和一个重要注意事项。

其好处是在使用 CTP 时,您可以在产品开发过程中提供有关反馈(通过 connect.microsoft.com 网站),而团队能够根据这些反馈即时采取行动!如果等到测试版或者更糟糕,直到预发布阶段才纳入您的反馈,处理起来就要困难得多。在 CTP 期间,任何事情都可能发生,并且在必要时,团队甚至会进行大规模的改动。

其中有个注意事项。CTP 并不适用于生产用途。当然,Windows PowerShell™ 2.0 CTP2 可能是您接触到的其中一个最稳定的预发布代码部分,但您要清楚,下一个 CTP 最终产品可能是完全不同的一个应用程序。因此请不要开始依赖 CTP2,因为下一个版本可能需要您从头开始。

请注意,CTP 无法与 Windows PowerShell 1.0 同时安装。对于理想的安装情况,系统还应同时安装 Microsoft® .NET Framework 3.5 以便启用所有可用功能。否则,一些功能将受到限制。

此外,由于 CTP 是非常早的代码,而 Microsoft 目前将大部分精力都放到了在最新操作系统(即 Windows Vista® 和 Windows Server® 2008)中运行的应用程序上。因此当前的操作系统兼容性并不代表最终发布代码也存在操作系统兼容性问题。在开发周期的后期阶段,会格外重视在旧软件中移植新功能的问题。

两种远程作业类型

在远程管理领域中,通常存在以下两种远程作业类型:扇入和扇出。扇入远程作业包括多个管理员,他们执行到单个服务器的安全外壳连接。Windows PowerShell 设计为通过一种安全的分区方式启用此功能,以便能够为客户提供对服务器的各部分的管理访问权限,例如,公司的 Exchange Server 即是如此。通过扇入远程作业,您可以采用交互的方式在远程安全地访问远程服务器上安装的 Windows PowerShell 副本(仅限版本 2.0!)。

扇出远程作业是指立即向整组远程服务器发出一组命令。这些命令从工作站并行“扇出”到服务器组。它们在每台服务器上都会执行,并且结果会以 Windows PowerShell 对象的形式返回到工作站,以便复查和处理它们。Windows PowerShell 支持两种核心的扇出远程作业技术 — Windows® 管理规范 (WMI) 和 Windows 远程管理 (WinRM),它们首先在 Windows Server 2008 中推出,而后在 Windows PowerShell 2.0 CTP 中又有所更新。

同步与异步

实际上,Windows PowerShell 1.0 甚至也有一些基本的扇出功能,它们都与 WMI 相关。例如,您可以轻松地创建一个计算机名称数组,然后从中检索 WMI 类:

$names = @("server1","server2","server2")
Get-WmiObject Win32_OperatingSystem 
    –computer $names

执行方法时(例如重启计算机)需要的操作会更多一些,因为版本 1.0 没有提供执行 WMI 方法的批量方式。但在 2.0 CTP 版本中改变了这种情况,而这应归功于 Invoke-WmiMethod cmdlet:

$names = @("server1","server2","server2")
Get-WmiObject Win32_OperatingSystem     –computer $names | `
 Invoke-WmiMethod Reboot

但是,此技术存在一个问题。它是同步的,这意味着每台计算机一次只能与一台计算机联系,并且必须等到每台计算机都执行完毕后才可以执行其他命令。但是,CTP 引入了一种全新的概念,即后台作业,这将允许在后台执行类似上面所说的命令。简单说来,只需添加 –AsJob 参数即可在后台运行 WMI 命令:

$names = @("server1","server2","server2")
Get-WmiObject Win32_OperatingSystem     –computer $names -asjob

可通过运行 Get-PSJob 来查看最终作业的状态,通过运行 Receive-PSJob 来查看作业的最终结果。(我将在以后的专栏中介绍更多有关作业管理的详细信息。)但是,Invoke-Command cmdlet 为在后台运行命令提供了更好的方式,如下所示:

$command = { Get-WmiObject     Win32_OperatingSystem }
$names = @("server1","server2","server2")
Invoke-Command –command $command     –computer $names –asjob

它实际上是将 Get-WmiObject 命令向外推送到每台指定的计算机,然后在本地执行。它的执行速度通常要快得多,并且不必依赖 WMI 远程过程调用 (RPC) 连接。相反,Invoke-Command 使用的是 WinRM,默认情况下,WinRM 使用端口 80 或 443。这些端口可轻松地导航防火墙,并且是完全可配置的。Invoke-Command 还支持用于备用凭据和限制的其他参数,允许您将数以百计的计算机作为目标,但只并行运行其中的数台。这可以避免拥堵和过度开销。

可重用的运行空间

如果打算多次远程管理给定的一组计算机,应考虑使用运行空间而非简单的计算机名称列表。在 Windows PowerShell 中,运行空间只是外壳引擎的一个实例(无论它是作为外壳控制台窗口在计算机中本地运行,还是在远程计算机中在后台运行)。启动远程运行空间非常简单:

$names = @("server1","server2","server2")
New-RunSpace –computer $names

由于运行空间也使用 WinRM,因此默认情况下它们也使用端口 80(如果指定 –UseSSL 参数,则为 443)。它们也可以接受备用凭据等。如果检索最终的运行空间对象,可将其传递给 Invoke-Command,Windows PowerShell 会将命令向外推送到这些运行空间所在的计算机中:

$command = { Get-WmiObject     Win32_OperatingSystem }
$rs = Get-Runspace
Invoke-Command –command $command     –runspace $rs –asjob

这样做的好处是只要外壳处于打开状态,运行空间就始终是活动的,因此可以很方便地针对其他命令重用它们。

扇入远程作业

运行空间也是扇入远程作业的关键所在。例如,在图 1 中,我在远程计算机上创建了一个运行空间并检索了对该运行空间的一个引用,然后又使用 Push-Runspace cmdlet 激活了该运行空间。此时,我在远程计算机上运行命令,非常类似于 SSH 或其他远程外壳实用程序所允许的那样。运行 Pop-Runspace 将返回我的原始“本地”运行空间,并且外壳提示符会帮助我随时跟踪我所在的位置。

fig01.gif

图 1 使用运行空间在远程计算机上运行命令(单击图像可查看大图)

我所运行的具体命令顺序如下:

PS C:\>new-runspace -computer     "WIN-YFZXQMHXAWM"
PS C:\>$server2 = get-runspace -sessionid 2
PS C:\>push-runspace $server2
[win-yfzxqmhxawm]: PS C:\Windows\System32>    pop-runspace
PS C:\>

此技术被称为扇入,因为多个管理员可以同时打开同一台服务器上的远程交互式运行空间 — 他们从各自的工作站“扇入”到服务器。Windows PowerShell 2.0 中的新安全模型允许创建受限制外壳和 cmdlet,因此每个管理员均无法进行全局修改。每人都被限制在其自己的外壳区域。(这些新的安全技术需要通过以 .NET Framework 为目标的语言进行一些自定义的软件开发。此内容超出了 Windows PowerShell 专栏的范围,但最好知道存在这些功能。)

2.0 中的杀手级应用程序

Windows PowerShell 2.0 CTP 新增了一组无与伦比的功能。在我看来,远程功能即是杀手级应用程序。几乎所有环境中的每个管理员都可以从中受益。

您应当熟悉这些功能,以便向产品团队提供您的建议。您是否希望通过组策略来管理 WinRM 默认端口?cmdlet 的工作方式是否应有所不同?是否存在性能问题?WinRM 配置起来容易吗?您可以将建议发送到 connect.microsoft.com 来发表您的观点,或与 MVP 奖获者以及我本人(要与我联系,请将您的反馈发布到论坛 ScriptingAnswers.com)共享您的反馈。让我们共同参与,一起构建下一代 Windows PowerShell 的杀手级应用程序!

本月 Cmdlet:Select-Object

尝试一下:Get-Service | ConvertTo-HTML | Out-File Services.htm。现在,在 Web 浏览器中查看得到的 HTML 文件。显示的信息非常多,是不是?如果说有一种方法可以通过选择感兴趣的信息来精简页面内容的话,那这种方法就是 Select-Object。例如,如果只需要服务名称和当前状态的列表。可使用:Get-Service | Select Name,Status | ConvertTo-HTML | Out-File Services.htm。

但是,需要记住的一件事是 Select-Object 舍弃了原始对象(在本例中为服务)而生成了一个仅包含指定属性的自定义对象(实际为 PSCustom 对象类型)。该原始对象的任何功能都已无法再访问,因此您可能会希望将 Select-Object 放在管道结尾处,以尽可能处理原始对象。

Don Jones 是《Windows PowerShell v2.0:TFM》的合著者,也是 ScriptingAnswers.com“特种部队”教室培训 (scriptinganswers.com/training.asp) 的培训师。您可以通过 jeepdon@mac.com 与他联系。

© 2008 Microsoft Corporation 和 CMP Media, LLC。保留所有权利;未经允许不得复制本文的部分或全部内容。