PowerShell 2.0最重要和值得人兴奋的特性就是其具有的远程管理的能力,PowerShell远程管理可以通过远程管理计算机,远程管理是通过WinRM(Windows Remote Management)起作用的,而WinRM是基于微软的WS-Management协议的。
在PowerShell 2.0中这个特性是作为统一代码执行模型(UCEM,Universal Code Execution Model)执行的。UCEM意味着在本地能执行的就能在任意位置执行。PowerShell远程管理也能从本地线程导入远程命令——这个特性作为隐含的远程管理,允许用户保存和导出这些引入的命令到硬盘上并能作为可在以后使用的模块。PowerShell 2.0 还具有一系列其他诸如互交式线程的特性,将会在后面逐个介绍。
PowerShell的远程管理允许多种连接方式,包括互交(1:1)、输出(1:n)以及输入(n:1通过使用IIS主机模型),这里将会逐个解释如何配置主机以上述形式工作。
PowerShell 2.0远程管理的条件:
为了启用PowerShell远程管理,所有参与远程管理的计算机都应该安装以下软件:
1. Windows PowerShell 2.0
2. NET Framework 2.0 SP1以上
3. Windows Remote Management(WinRM)2.0
以上软件在Wndows 7和Windows Server 2008 R2上是默认安装的,早期其他版本的Windows需要读者自行从微软网站上下载和安装。
PowerShell 2.0 和WinRM 2.0 是作为Windows Management Framework的一部分提供下载的,针对Windows XP,Windows Server 2003,Windows Vista和Windows Server 2008操作系统有效。WinRM2.0和PowerShell2.0能够安装在以下几种操作系统上:
1. Windows Server 2008 with Service Pack 1
2. Windows Server 2008 with Service Pack 2
3. Windows Server 2003 with Service Pack 2
4. Windows Vista with Service Pack 2
5. Windows Vista with Service Pack 1
6. Windows XP with Service Pack 3
7. Windows Embedded POSReady 2009
8. Windows Embedded for Point of Service 1.1
为了能在远程计算机上运行脚本和命令,执行远程脚本的用户必须具有以下特点:
在远程主机上属于administrators组的成员,或
在执行远程相关命令时能提供administrator凭据,或
在远程主机上具有访问PS线程配置信息的权限
同样,要求客户端的Windows操作系统版本是Windows Vista和Windows 7,网络位置需要被设置为家庭或工作组。如果任何网络适配器的网络位置被设置为public,WS-Management的功能可能会不完全。
PowerShell中传统的远程命令
在PowerShell中有些cmdlet支持对远程计算机的信息访问。这些cmdlet都有一个ComputerName参数。比如,下列的cmdlet支持computername参数,因此可以用来从远程计算机获取信息。
• Get-WmiObject
• Invoke-WmiMethod
• Limit-EventLog
• Set-Service
• Set-WmiInstance
• Show-EventLog
• Stop-Computer
• Clear-EventLog
• Get-Counter
• New-EventLog
• Register-WmiEvent
• Remove-EventLog
• Remove-WmiObject
• Restart-Computer
• Get-EventLog
• Get-HotFix
• Get-Process
• Get-Service
• Get-WinEvent
这些cmdlet的远程管理能力是独立于PowerShell的。由于cmdlet作者通过类似于远程过程调用(RPC)的方法来实现,此类方法被称之为传统的远程方法。
明显的弱点在于并不是所有的PowerShell的cmdlet都支持此类远程管理方法。比如,如果用户想要在远程计算机上执行Get-PSDrive或Get-Childitem是不可能的。此时,新的PowerShell 2.0所具有的远程管理的特性就变得很重要了。这里介绍的远程管理是针对此类崭新的远程技术。
远程cmdlet概况
下面介绍一部分在PowerShell远程管理中需要的重要的cmdlet,也许这些cmdlet并不都是可直接用于执行远程命令,但是能够用于配置远程管理。
Enable-PSRemoting
Enable-PSRemoting 用于配置计算机接受通过WS-Management技术发送的Windows PowerShell 远程命令。如果要启用PowerShell远程特性需首先且仅需执行这个cmdlet一遍。这个cmdlet会马上调用Set-WSManQuickConfig配置WinRM服务,为WS Management启用防火墙的例外,最后启用所有已注册的PowerShell配置。
提醒:如果需要计算机接受远程主机发送的命令,则必须启用PowerShell的远程管理配置;如果只是发送命令到远程主机咋不需要启用PowerShell远程管理。
Disable-Command
Disable-Command用于禁用当前计算机所有的PowerShell线程配置,使计算机接受任何从远程主机发送的命令。在禁用PowerShell的远程管理后,不再希望WinRM服务自启动,则需要手动停止该服务。
Invoke-Command
Invoke-Command用于在本地或远程主机上执行命令并返回命令的输出,包括错误。用单独的Invoke-Command命令,可以在多台主机上运行命令。这个cmdlet默认情况下会在远程计算机开启线程用于运行命令,当执行完毕命令则将其关闭。这种方式块可能会比较换慢慢需要在特定的预定义线程信息下执行。
New-PSSession
Invoke-Command cmdlet支持指定已存在的线程用于加强命令执行的速度。通过制定特定的线程,用户可以免去凭空创建和销毁线程的需要。New-PSSession cmdlet能用于在远程计算机中创建持久连接。通过创建持久线程,用户可以分享数据,如在相同PSSession中的不同命令间共享函数或者变量值。
Enter-PSSession
Enter-PSSession cmdlet能和单独的远程主机启动交互式线程。在线程存活期间,用户向远程主机键入的命令,就如同直接在远程主机上执行。在同一时间只能启动一个交互式线程,用户能通过此cmdlet指定由New-PSSession cmdlet创建的PSSession。
Exit-PSSession
Exit-PSSession将退出由Enter-PSSession cmdlet创建的互交式的PS线程。
Get-PSSession
Get-PSSession获取在当前线程中创建的Windows PowerShell线程(PSSession),当没有参数指定的情况下,这个cmdlet获取所有的PSSession并返回所有的PSSession到一个变量,用户能在其他类似于Invoke-Command,Enter-PSSession,Remove-PSSession等cmdlet中使用这些线程信息。
Remove-PSSession
Remove-PSSession用于关闭PS线程,将会停止任何在PSSession中运行的命令,结束PSSession,并释放所有PSSession占用的资源。如果PSSesion正在连接到远程计算机,Remove-PSSession将会关闭本地到远程计算机的连接。
Import-PSSession
Import-PSSession使用PowrShell 2.0隐含的远程特性。隐含的远程特性允许用户从本地/远程将命令导入到现存的PS线程中,如果是在本地线程中则直接运行命令。
Export-PSSession
Export-PSSession用于从本机或远程计算机的其他PSSession中获取cmdlet,函数,别名以及其他命令格式,并将其作为Windows PowerShell模块存储到本地硬盘。用户能用Import-Module cmdlet从存储的模块获取命令并添加到PS线程中。
Register-PSSessionConguration
任何用Invoke-Command、New-PSSession或任何PowerShell远程cmdlet创建的PS线程,在$PSSessionConfigurationName变量中指定用默认的PS线程配置信息。PS线程配置信息用于确定那些命令在线程中是可用的,并且包含保护计算机的设置,诸如限制线程单个对象或命令能接收数据的数量。这样,用户能用Register-PSSessionConfiguration cmdlet在本地计算机中创建和注册新的线程配置信息。
Unregister-PSSessionConguration
Unregister-PSSessionConguration 用于删除在计算机注册线程的配置信息。使用此cmdlet可能会删除默认的PSSession配置信息(Microsoft.PowerShell或Microsoft.PowerShell32),此时就需要使用Enable-PSRemoting cmdlet创新创建和注册默认PS线程配置信息。
Disable-PSSessionConfiguration
Disable-PSSessionConfiguration用于将注册的PS线程配置信息置成失效。这里需要强调的是此操作只将配置信息设置为失效,并未从本机反注册或删除信息,这样将会使线程配置信息不能被用于创建远程线程。
Enable-PSSessionConfiguration
Enable-PSSessionConfiguration用于将通过Disable-PSSessionConfiguration置为失效的线程配置信息重新生效。
Get-PSSessionConfiguration
Get-PSSessionConfiguration用于获取已在本地计算机上注册的线程配置信息。
Set-PSSessionConfiguration
Set-PSSessionConfiguration用于更改已在本地计算机注册的线程配置信息的属性。
Test-WSMan
PowerShell远程管理需要在远程主机上运行WinRM服务。用户可以使用Test-WSMan cmdlet快速检查是否能从其他计算机创建远程线程。如果WinRM没有在远程主机上启用,用户能安全的确认PowerShell远程管理没有被启用。然而,却不能只通过检查WinRM服务是否运行来确认PowerShell远程管理是否被启用,因为这个cmdlet是通过检查WinRM服务和远程管理所需的许多功能组件是否齐备来判断的。
Enable-WSManCredSSP
PowerShell远程管理支持CredSSP认证并且可以通过Enable-WSManCredSSP cmdlet启用。Enable-WSManCredSSP启用客户端或服务器的CredSSP认证,当CredSSP认证被使用,用户凭据被传递到远程计算机用于认证。此类认证被设计用于通过已创建的远程线程传递认证信息到另外的远程线程命令。比如,用户可以在远程计算机中运行后台任务时使用此类认证。
Disable-WSManCredSSP
Disable-WSManCredSSP用于在客户端或服务器禁用CredSSP认证。
另外还有其他的WSMan cmdlet在PowerShell 2.0中引入,诸如Connect-WSMan,Disconnect-WSMan,Get-WSManInstance,New-WSManInstance,New-WSManSessionOption,Remove-WSManInstance和Set-WSManInstance,这些cmdlet并不是直接用于PowerShell远程管理的,但会在后续的文章中根据需要进行介绍。
总结
PowerShell 2.0所支持的远程管理,使其对网络中的其他主机有了更高效的管理手段,这样Windows除了以往的远程桌面以外,也有了可以和Unix/Linux匹敌的强大命令行支持,而且这里是通过序列化的XML对命令的执行结果所包含的对象进行传输,在传输到本地之后再进行反序列化解包恢复出对象。Windows基于对象的操作形式不仅被扩展到了命令行,而且命令行还是基于网络的,这就使其强大的功能远远超过了Unix/Linux基于文字的命令,因为对象所具有的各种特性的表现形式远比文字所能表达的内容要强大和详实。另外远程管理能够将远程cmdlet引入到本地,可以实现不同产品类型下的cmdlet可以在本地实现映射,在通过本地主机和管理目标间的认证之后,就可不再考虑线程的问题了。
尽管现在处于CTP3版本的PowerShell在远程主机的认证方面还存在一定局限,因为多种版本的Windows在认证手段上还是有差别的,这里远程管理的功能可能在活动目录授权的模式下工作的更好一些。但是相信在V2正式版发布时,远程管理的功能将会进一步完善。关于PowerShell远程管理更多的详细操作和技术细节将会在后续的文章中进行详细的介绍。
赛迪网地址:http://tech.ccidnet.com/art/302/20100701/2102213_1.html
作者: 付海军
版权:本文版权归作者所有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.shell.tor.hu/