第13章 远程处理:一对一及一对多
13.1 PowerShell远程处理的原理
在一定程度上讲,PowerShell的远程处理类似于Telnet或者其他一些老旧的远程处理技术。当键入命令时,它会在远程计算机上运行。只有该命令的运行结果会返回本地计算机。与Telnet和Secure Shell(SSH)不一样的是,PowerShell采用一种新的通信协议,我们称之为针对管理的Web服务(Web Services for Management,WS-MAN)。
WS-MAN完全基于HTTP或者HTTPS进行工作,这样保证在需要的情况下,能轻易透过防火墙进行作业(因为每种协议都使用唯一的端口进行通信)。微软对WS-MAN的实现主要基于一个后台服务:Windows远程管理组件(WinRM)。在安装PowerShell(第2版)的时候会同时安装Win-RM,在Windows 2012以及更新版本的Windows中默认处于启用状态(通常来说,在服务器操作系统处于启用状态,在客户端操作系统处于禁用状态)。
要保证远程处理可以正常工作,需要满足下面两个条件。
- 本机计算机和远程计算机(需要运行命令的计算机)至少需要第2版或者更新版本的PowerShell。Windows XP是PowerShell v2支持的最老版本的操作系统,所以它也是能实现远程处理功能最老版本的操作系统。
- 理论上,两台计算机需要在同一域或者可信域中。如果计算机不在域中, 远程处理也可以正常工作,但配置会有些麻烦。本章不会讲到这一点。如果你想了解该类场景,请在PowerShell中运行Help About_Remote_Troubleshooting。
13.2 Win-RM概述
首先我们会讲到WinRM,因为在使用远程处理之前,我们必须配置该服务。再次声明,你只需要在接收远程命令的计算机上配置WinRM以及PowerShell远程处理即可。
并非只有PowerShell能使用WinRM服务。实际上,微软在越来越多的管理程序中开始使用WinRM服务——甚至包含已经使用了其他协议的那些程序。
WinRM类似一个调度器:当有新的流量进来后,WinRM会决定由哪种程序来处理这部分流量。所有WinRM流量都标记了接收应用程序的名称,同时这些应用程序都必须在WinRM中创建各自的端点,这样WinRM才能侦听这些主体的流量。
我们可以采用下面的方法创建一个端点:新开一个PowerShell窗口——需要以管理员权限运行PowerShell,之后运行** Enable-PSRemoting
**命令。有些时候你可能会看到另外一个相关的命令Set-WSManQuickConfig。但是根本没必要手动运行该命令,Enable-PSRemoting命令会自动调用该命令。另外,Enable-PSRemoting命令也会运行一些其他步骤完成开启远程处理服务。总体来说,该Cmdlet会启用WinRM服务,配置该服务为自动启动模式,然后在WinRM中为PowerShell注册一个端口,甚至会在Windows防火墙中针对传入的WinRM流量创建例外条件。
如果你对需要到每台计算机上去开启远程处理服务感到厌烦,没关系,你也可以通过组策略对象(GPO)实现。这些必要的GPO设置选项已经内置到Windows Server 2008 R2(以及后续版本操作系统)的域控制器计算机中。打开一个GPO对象,之后查看路径“计算机配置”>“管理模板”>“Windows组件”>下的对象。在该列表的中间部分,你可以看到“Windows远程Shell”(Windows Remote Shell)和“Windows远程管理”(WinRM)。
第2版及后续的WinRM服务默认会使用TCP端口5985侦听HTTP,使用5986端口侦听HTTPS。这样的端口号保证了不会与本地安装的任意Web服务器使用的端口号(一般使用80~443之间的端口号)冲突。使用Enable-PSRemoting创建的远程处理默认仅对5985端口创建非加密的HTTP侦听器。当然,你也可以配置WinRM使用其他端口。
如果你确定要修改端口号,可以通过下面的命令实现。
WinRM Set WinRM/Config/Listener?Address=*+Transport=HTTP@{Port="1234"}
13.3 一对一场景的Enter-PSSession和Exit-PSSession
PowerShell可以通过两种方法实现远程处理,第一种称为一对一或者1:1远程处理(第二种称为一对多,或者1:n远程处理,在下一节中会讲到一对多场景)。当使用一对一远程处理时,实际上是在单台远程计算机上调用了一个Shell命令窗口。输入的任何命令都会直接在该计算机上运行,然后在远程处理窗口中返回输出结果。该机制非常类似于远程桌面连接(Remote Desktop Connection),只是Windows PowerShell采用的是命令行环境。相对于远程桌面连接,这种远程处理技术只需要使用很少的资源,所以对服务器来讲,开销会小很多。
如果需要对一台远程计算机建立一对一的远程处理进程,请运行下面的命令。
Enter-PSSession -ComputerName Server-R2
假如在远程计算机上已经启用了远程处理,两台计算机在同一个域中,并且网络质量良好,那么你应该可以得到一个连接。如果Shell命令窗口变为下面的格式,那么也就说明该连接成功建立。
[Server-R2] PS C:\>
你的权限以及特权在远程连接中也会继续保持。你运行的PowerShell副本会带有其运行的安全令牌。你在远程计算机上运行的任何命令都依赖于你的凭据,所以你能实现你权限范围之内的任意操作。该过程类似于你通过远程桌面连接到对应的远程计算机,然后在该计算机上运行本地的PowerShell。
下面介绍两个不同点。
- 即使远程计算机上PowerShell存在一个Profile脚本,当使用远程处理时,该脚本也不会运行。
- 远程计算机的运行策略会限制某些脚本的运行。
13.4 一对多场景的Invoke-Command
下面讲的是Windows PowerShell最酷的功能之一,也就是将一个命令同时传递给多台计算机。是的,就是这样,可称之为全面的分布式计算。每台计算机都独立运行发送的命令,然后将结果集返回给你。PowerShell利用Invoke-Command来实现该功能,称之为一对多或者1:n远程处理。
该命令类似下面的语句。
Invoke-Command -ComputerName Server-R2,Server-DC4,Server12
-Command {Get-EventLog Security -Newest 200 |
Where {$_.EventID -eq 1212 }}
另外,需要告知你的是,在Invoke-Command的帮助信息中找不到-Command参数,但是我们确认上面示例中的命令可以正常运行。实际上,-Command参数是帮助文档中-ScriptBlock参数的一个别名或者昵称。
如果你认真查阅了Invoke-Command的帮助文档,你应该会注意到其中一个参数,该参数允许我们指定一个脚本文件,而不是一个命令。该参数可以将本地的完整脚本传递到远程计算机——意味着你可以自动化一些复杂的任务,让每一台计算机完成各自对应的部分。
动手实验:确保你在Invoke-Command的帮助文档中找到了-ScriptBlock参数,同时能找到允许指定一个文件路径以及名称的参数(-FilePath)(并不是一段脚本)。
我们可以将所有的计算机按照对应的种类,比如Web服务器和域控制器,放入到各自的文本文档中。文本文档的每行代表一个计算机名称——不需要使用逗号、引号。通过PowerShell,我们可以很轻易地使用这些文本文档中的内容。
Invoke-Command -Command {dir} -ComputerName (Get-Content WebServers.txt)
如果我们要使用Get-ADComputer命令,那么我们需要找到一个方法去获取这些计算机对象名称属性的值。比如下面的命令。
Invoke-Command -Comand {dir} -ComputerName(
Get-ADComputer -Filter * SearchBase "OU=Sales,DC=Company,DC=pri" |
Select-Object -Expand Name)
13.5.3 反序列化对象
远程处理的另一个需要注意的事项是返回给本地计算机的对象可能会缺失部分功能。在大部分情况中,由于它们不再需要关联到可用软件,它们都会缺少对应的方法(Method)。
13.7 远程处理的配置选项
通过阅读帮助文档,可以看到Invoke-Command和Enter-PSSession命令都有一个-SessionOption参数(该参数能处理PSSessionOption类型对象)。该参数有什么功能呢?
这两个命令在运行时都会初始化一个新的PowerShell连接或者会话。它们完成对应的工作后,会自动关闭该会话。一个会话选项(Session Option)是指你可以用来改变建立会话方式的一组选项。我们使用New-PSSessionOption命令实现该功能。你可以使用该命令实现下面的功能。
- 打开、取消和空闲超时。
- 取消正常数据流的压缩或者加密功能。
- 通过代理服务器传递网络流量时,也可以设置一些代理相关的选项。
- 忽略远程机器的SSL证书、名称以及其他安全特性。
比如,通过下面的命令可以忽略机器名称检查,然后打开一个会话。
PS C:\>Enter-PSSession -ComputerName Wcmis034
-SessionOption (New-PSSessionOption SkipCNCheck)
[WCMIS034]:PS C:Users\wh42\Documents>
标签:13,计算机,一对一,WinRM,PowerShell,命令,Command,远程
From: https://www.cnblogs.com/evan-whc/p/17091689.html