PowerShell远程操作

简介:

PowerShell远程操作是远程管理的基础,它为集中管理分布式系统提供了又一种可靠、高效的方法。

  一般来说PowerShell远程操作依赖于远程处理基础结构,但为数不多的几个自身具有远程处理能力的命令除外,如Get-Service、Get-Process、Get-WMIObject、Get-EventLog和Get-WinEvent等。(不难看出,这些命令都是“读取”系统的某些方面的信息,不做更改。它们依赖.Net Framework完成远程操作。)

配置远程基础结构

  远程基础结构是远程操作的基础,正确设置远程基础结构才能使远程命令正确执行。好在远程基础结构虽然重要,但是配置起来非常简单。实际上,只要设置好以下两点就可以进行远程操作了:

  1、以管理员身份运行。要进行远程操作,必须以管理员身份启动PowerShell命令行,即使当前用户是系统管理员也要如此。

  2、启用远程处理模式。启用远程处理模式之后,依赖远程基础结构的命令才能正确执行。启用远程处理模式请使用enable-psremoting命令。有的系统默认已经开启了远程处理模式,检查远程处理模式是否启动,可以执行new-pssession命令。如果新的会话成功创建,则说明远程模式启动,远程基础结构配置成功。

执行远程操作

  配置好远程基础结构,就可以执行远程操作了。远程操作主要依赖几个Session(会话)命令和Invoke-Command命令来进行。常见的使用情况有三种场景:

  场景一:远程交互式会话

  这个场景一般用于手动进行远程操作,输入命令,查看结果。方法很简单。进入交互式会话的命令是Enter-PSSession,退出时键入Exit-PSSession或者exit都可以。远程交互式操作期间,输入的命令在远程计算机上运行,就像直接在远程计算机上输入并执行这些命令一样。期间所定义的变量和命令的执行结果在退出交互式会话之后不再可用。

  场景二:脚本块、脚本文件的一次性执行

  这种场景,是在本地计算机与远程计算机上建立一个临时会话。将脚本块或者脚本文件的内容发送到远程计算机执行,并将结果发回本地计算机。这种方法执行效率很高,是PowerShell推荐的执行远程命令的方法。除非需要在会话中共享数据,否则建议使用该方法。

  场景三:脚本块、脚本文件在命名会话中执行

  这种场景是最复杂的,也是功能最强大的。会话会保持所有定义的变量、函数和脚本,导入的模块和管理单元,有利于共享数据。使用方法如下:

  1、定义会话: 请使用new-pssession命令定义会话,如$session1 = new-pssession –computer server1。(如果必要请使用Credential参数。)

  2、在会话中远程执行脚本(或者脚本文件): 请使用Invoke-Command命令执行远程脚本,如Invoke-Command -Session $session1 -ScriptBlock {dir c:\}或者Invoke-Command -Session $session1 -FilePath .\dirDriveC.ps1

  3、获得结果: 可以将执行结果赋于变量,如$sub = Invoke-Command -Session $session1 -ScriptBlock {dir c:\}或者$sub = Invoke-Command -Session $session1 -FilePath .\dirDriveC.ps1

  后续命令可参照步骤2或者3继续执行,所有执行的命令就好像在同一个上下文中执行一样。

结语

  网络时代的Shell或者脚本语言必须具有很强的网络处理能力,PowerShell就是这样的语言。微软的产品一般来说将安全性看得很重,所以PowerShell在网络处理方面有诸多限制。比如PowerShell不能在远程机器上显示界面,即使是有界面的程序,也只能在后台运行。熊掌和鱼肉不可兼得,好在我们总能找到一些解决办法。比如上述问题可以借助微软的PsExec工具来实现,详细信息见Windows Sysinternals.


在本章将会介绍PowerShell的内置特性,这些特性能够使用户在远程主机上运行命令和脚本。

通过使用交互式远程管理可以克服使用Invoke-Command的一些缺点,然而这种方法也是有其局限性的。在交互式远程管理中,用户需要显式的进入或退出远程线程,这就意味着,同时只能连接到一个远程主机上,而且只能访问对应远程主机上的cmdlet和模块。如果需要让不同的cmdlet在不同的主机上都可以执行,这就做不到了。

比如,有两台主机分别各自安装了Exchange 2010和SharePoint 2010,如果用户需要访问两台主机上各自可用的cmdlet,两台主机和本机之间均会建立一个本地线程。使用Invoke-Command会建立到远程主机的线程,并通过该线程发送脚本块执行。尽管通过交互式远程管理可以指定特定的远程线程,但是同一时间只能连接到Exchange 2010主机或者是SharePoint 2010主机当中的一台,无法实现各主机间cmdlet的共享,此时隐式远程管理就很重要了。

隐式远程管理能将远程的命令带到本地线程中,一旦将远程命令带到本地就不需要考虑PS线程的细节了。用户可以同时导入很多远程线程到本地线程,这样就可以实现在同一本地线程中访问不同产品的技术,PowerShell会在后台为用户关注具体的执行细节。

创建隐式远程管理

首先可以使用New-PSSession创建持久PS线程,接下来将该线程的远程命令导入到本地线程中,具体代码如下所示:

$s = New-PSSession -ComputerName WinServ-wfe

Import-PSSession -Session $s

默认情况下,Import-PSSession会导入除与当前线程中重名的命令外所有的命令,如果要导入所有的命令,需要使用-AllowClobber参数,在导入到过程中用户能看到控制台顶端会有进度条显示导入进度。如果用户导入的与本地线程同名的命令,导入的命令会隐藏或替换原始命令。这是因为导入的线程将会在导入之前将cmdlet转换为函数,而函数的优先级是高于cmdlet的,这样导入命令的优先级将会高于本地同名命令,在导入线程之后这些命令将会被导入。

对于导入的远程命令优先级,别名将会是个例外,本地线程这种原始别名的优先级会高于导入的别名。

导入远程线程时避免命名冲突

Import-PSSession提供了-Prefix参数用于为导入命令在其名词添加指定的前缀,如下例所示:

Import-PSSession -Session $s -Prefix RS

当从远程主机导入cmdlet时会为每个cmdlet添加RS前缀,如果Get-Command用这样的方式导入到本地线程中时需要通过调用Get-RSCommand来调用该cmdlet,PowerShell将会在远程主机上隐式运行该命令。

前面的章节中曾讨论过PowerShell在后台管理隐式远程管理,Invoke-Command会在每次执行远程命令前后,创建和销毁PS线程,对于隐式远程管理也是这样。以这种形式执行远程命令会比较缓慢,为了避免这种情况,Import-PSSession会在本地线程中向所有导入的命令添加-asJob参数。例如:

$s = New-PSSession -ComputerName WinServ-wfe

Import-PSSession -Session $s -Prefix RS

Get-RSProcess -asJob

这会将Get-RSProcess作为后台任务在远程主机运行,需要强调的是原始Get-Process是没有-asJob参数的,这里的-asJob只是作为本地线程传递给远程主机时使用的。

向本地线程中导入模块和管理单元

$s = New-PSSession -ComputerName WinServ-wfe

Invoke-Command -Session $s -ScriptBlock {Import-Module ActiveDirectory}

Import-PSSession -Session $s -Module ActiveDirectory

在上面的例子中首先创建了PS线程,用Invoke-Command导入了活动目录模块,并将线程导入本地线程。这样就使活动目录cmdlet在本地线程中可用了。

接下来连接到另外一个不同的远程线程并从该线程cmdlet:

$s = New-PSSession -ComputerName WinServ-wfe

Invoke-Command -Session $s -ScriptBlock {Add-PSSnapin Microsoft.SharePoint.PowerShell}

Import-PSSession -Session $s

此时在本地线程中,用户级可以访问一台主机上关于AD的cmdlet,也能访问另一台主机上的SharePoint 2010的cmdlet。这样就能通过本地线程同时管理两台主机了,而且不需要考虑创建和销毁线程的问题,PowerShell会替用户处理这些。

隐式远程管理的局限性

使用隐式远程管理时,用户不能导入变量或者PowerShell提供者,用户不能。Import-PSSession用Invoke-PSSession运行远程命令,可能会比较缓慢,因此所有导入的命令支持-asJob参数将命令作为远程主机上的后台任务执行,关于-asJob参数的用法可以参照前几篇文章中的具体介绍。

总结

隐式远程管理会将远程的命令带到本地,这项技术可以被用于导入在本地PowerShell环境中不存在的模块和管理单元,在本章中介绍了如何创建隐式远程线程以及用于Import-PSSession cmdlet的相关参数。隐式远程管理可以看作是将远程cmdlet缓存到本地,就可以同时将多台主机的cmdlet缓存到本地(当然是在考虑不重名的情况下),每个cmdlet在本地会有对应的隐射关系对应到特定远程主机上特定的cmdlet,在本地对cmdlet最终会通过远程管理机制传递到远程主机进行执行。如果是在重名的情况下,远程引入的cmdlet会在本地以函数的形式存在,故而通常的优先级会被本地cmdlet要高。因而在导入远程cmdlet之前需要为远程cmdlet在本地预设前缀,以方便与本地的cmdlet进行区分。


本文转自 bilinyee博客,原文链接:  http://blog.51cto.com/ericfu/1872827      如需转载请自行联系原作者

相关文章
|
弹性计算 关系型数据库 数据库
使用ROS部署ECS+SqlServer资源并通过PowerShell操作数据库
本文介绍如何通过ROS部署ECS+RDS+SqlServer资源,以及如何通过PowerShell操作SqlServer数据库。 注意:附录模板和截图中的commandtext部分仅为演示作用,请根据需求修改后使用。
使用ROS部署ECS+SqlServer资源并通过PowerShell操作数据库