PowerShell 远程管理之启用和执行命令

做者: 付海军
出处:http://fuhj02.blog.51cto.comhtml

PowerShell 2.0的远程管理功能很强大,为了方便读者学习这里首先介绍学习环境的设置,便于读者在理解原理的同时有相对形象的体验。在本文中,将会分别介绍了如何启用和禁用powershell的远程管理,以及如何在工做组和混合域环境下配置计算机。以及如何使用Invoke-Command cmdlet用于在远程主机上执行命令,建立持久线程,在多个命令间同一线程传递的变量和参数。用户还能够在执行较费时的命令时之后台任务的形式实现,并在执行完毕后使用命令回调执行结果。shell

1 启用和禁用远程管理
PowerShell 2.0中能经过在PowerShell提示符下执行下列的cmdlet启用远程管理
PS C:\> Enable-PSRemoting
该cmdlet会向用户询问几个问题以下图1所示
2041945.jpg
当执行该cmdlet时执行了如下操做,其中包括:
1. 启动或从新启动(若是已启动) WinRM 服务。
2. 将 WinRM 服务类型设置为自动启动。
3. 在本地计算机上建立一个侦听器以接受任意 IP 地址上的请求。
4. 对 WS-Management 流量启用防火墙例外(仅适用于 http),若是要启用PS远程管理,此时网络位置不能被设置为public,由于Windows 防火墙例外不能在网络位置是public时被启用。
5.启用全部注册的PS线程配置信息。
默认状况下,WinRM只启用http传输用于接收远程请求。用户可使用winrm命令或New-WSManIntance cmdlet手动启用https传输。
【提示】
默认状况下,PowerShell远程管理使用5985(http)和5986(https)端口。能够经过使用Set-Item cmdlet修改wsman:\Localhost\listener\listener*\port对端口号进行设置,须要注意的是这样的操做将会改变系统中每一个WinRM监听器端口号。
当给Enable-PSRemoting cmdlet增长-force参数后执行将会在静默状态下启用远程管理,PowerShell远程管理是不能经过远程启用的。
1.1 测试PowerShell远程管理
若是远程管理被启用了,可使用下面的cmdlet查看:
PS C:\ > Enter-PSSession –ComputerName localhost
用户将会看到以下图2所示的提示符:
2041947.jpg
【提示】
PowerShell线程(PS Session)是运行远程命令和脚本的环境。PowerShell 2.0提供了各式各样的cmdlet管理这些线程。可使用Get-Command –noun PSSession命令查看全部与PSSession相关的cmdlet。
能够用New-PSSesssionOption改变PS线程默认的表现。New-PSSession和Enter-PSSession有一个参数-sessionOption用于指定自定义线程选项,备选的选项有:
IdleTimeOut
定义远程主机的过时时间,在未收到本地计算机包括心跳信号在内的任何通讯数据的状况下,PSSession将会被关闭
OpenTimeOut
定义客户端主机等待线程创建链接的超时时间,一旦超时,创建链接的命令将会失败。
OperationTimeOut
定义能在PSSession中运行任何操做的最长时间,一旦超时,操做将会失败。
SkipCACheck
指定在经过HTTPS链接时,客户端不验证服务器证书是否由受信的CA签发
SkipCNCheck
指定服务器的证书普通名(CN,Common Name)不须要匹配服务器的主机名,这个选项只是用于经过HTTPS协议传输的远程操做。
SkipRevocationCheck
不验证主机证书的撤回状态。
1.2在工做组环境中远程管理
只经过运行Enable-PSRemoting cmdlet是直接没法链接到工做组中的计算机的。本质上来讲是由于加入工做组的计算机所拥有的安全级别是比加入域中的计算机更严格。因此若是再加入工做组中的计算机,用户在建立远程线程以前须要启用相关的设置。
Windows XP
用户须要确认将本地安全策略设置为网络登陆经典鉴权。经过控制面板→管理工具→本地安全策略,定位到“本地策略”→“安全选项”双击“网络访问:本地账户的共享和安全模式”,并设置为“经典-本地用户以本身的身份验证”,效果以下图3所示:
2041949.jpg
修改WSMan信任主机设置
在全部加入工做组的计算机——包括Windows XP,Windows Vista或更高版本,用户须要使用以下命令增长全部远程客户端的IP地址到受信主机清单中:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value *
使用*用于将全部主机添加为受信主机,若是须要指定特定的主机可使用下面的命令:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value Copmuter1,Computer2
若是须要添加指定域名下的全部主机可执行下面的命令:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value *.testdomain.com
若是须要添加远程主机的IP地址到受信主机的清单:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value 10.0.0.1
一旦作了上面的更改,用户能用Enable-PSRemoting cmdlet在这些工做组中的主机。
1.3在混合域环境中使用远程管理
默认状况下,不一样域下的用户即便是本地管理员组的成员仍然不能链接到其余域中的主机。这是由于从其余域的远程链接只是运行在独立的用户权限之上。为了能使不一样域的主机能够链接到本地计算机,用户能够更改LocalAccountTokenFilterPolicy注册表键值(设置为1)来容许其余域的成员到本地计算机
PS C:\ > new-itemproperty -name LocalAccountTokenFilterPolicy -path ` HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -propertyType DWord -value 1
1.4 在企业环境下启用远程管理
为了能在企业或域环境中的多台主机上启用远程管理,用户须要使用组策略,更多的信息能够从http://technet.microsoft.com/en-us/library/dd347642.aspx地址获取。
1.5禁用远程管理
用户可使用Disable-PSRemoting在本地主机上禁用远程管理。Disable-PSRemoting将会使线程配置信息失效,这样的操做并不会移除全部Enable-PSRemoting建立的配置,包括WinRM的启用状态和为PS远程管理建立的监听器。
若是在本机上没有任何服务或组件须要WinRM服务,用户能够经过执行下列命令禁用WinRM服务:
Set-Service winrm -StartupType Manual
Stop-Service winrm
为了移除默认状况下WinRM在5985端口设置的监听器能够执行的下述命令:
Get-ChildItem WSMan:\localhost\Listener –Recurse | Foreach-Object { $_.PSPath } | Where-Object { (Get-Item "$_\Port").Value -eq 5985 } | Remove-Item
2 执行远程命令
在远程管理的状况下,有两种方式在远程主机上运行命令或脚本。包括Invoke-Command cmdlet和交互式远程线程。一旦用户在本机启用远程管理,用户就能用Invoke-Command cmdlet在本机或远程主机运行命令和脚本。
2.1 在本地或远程主机运行脚本块
用户能用下面的方式在本地和远程主机调用命令:
Invoke-Command -ComputerName WinServ-wfe -ScriptBlock {Get-Process}
脚本块此参数能用于指定在远程主机运行的一系列命令。若是要在本地执行命令,则ComputerName参数不是必须的。若是用户须要在多个远程主机上执行相同的命令,用户能以下例所示经过逗号分隔的ComputerName参数或使用文本文件将主机清单传递给cmdlet:
Invoke-Command -ComputerName WinServ-wfe, SQL-Server2008 -ScriptBlock {Get-Process}
Invoke-Command -ComputerName (get-content c:\scripts\servers.txt) -ScriptBlock {Get-Process}
这种方式也被称之为散开式或一对多远程管理。用户能用一条命令在多台主机上执行相同的命令。
脚本块中全部的命令和变量均会在远程计算机上运行。若是用户采用相似于-ScriptBlock {Get-Process –Name $procName},PowerShell认为远程计算机线程中$procName变量已经定义过了。用户能经过使用Invoke-Command命令,将本地计算机上的变量传递到远程线程。
2.2 传递变量到远程线程
前面的例子中,用户能够传递要寻找的进程名做为变量。ArgumentList参数能帮助用户传递到远程线程中:
$procName = "powershell"
Invoke-Command -ComputerName (get-content c:\scripts\servers.txt) ` -ScriptBlock {param ($Name) Get-Process -Name $Name} –ArgumentList $procName
上面的例子中能够显示如何使用-ArgumentList参数传递本地变量到远程线程。
2.3 经过Invoke-Command使用持久线程
用户可使用带-ComputerName参数的Invoke-Command创建临时的线程执行远程命令。会在每次使用Invoke-Command cmdlet时,都会从新创建线程。在只是执行简单、为数很少的命令时可能无所谓,可是若是要执行大量命令和脚本时将会很是的耗时费力。为了不这种状况,就须要使用持久线程,用户能使用New-PSSession cmdlet建立对远程主机的持久链接。
$s = New-PSSession -ComputerName WinServ-wfe
此时,$s包含持久链接的线程细节,可使用$s在远程主机上调用命令语法以下:
Invoke-Commad -Session $s -ScriptBlock {get-Process}
当在远程组合机上执行命令时,$s会包含全部建立和修改的变量。这样以$s做为线程的后续执行的命令可以访问全部在远程主机上建立和更新的变量,以下例所示:
$s = new-pssession -computername WinServ-wfe
Invoke-Command -Session $s -ScriptBlock {$fileCount = (Get-ChildItem D:\ -Recurse).Count}
invoke-command -session $s -scriptblock {$fileCount}
用户能访问$fileCount变量,由于是使用了持久线程执行命令。若是只是使用-ComputerName调用命令这是不可能实现的。
2.4做为后台任务运行远程命令
前面的例子中获取远程主机上全部D:\下的文件数量,若是包含的文件数量很大的状况下将会很耗时,这样就须要等待远程命令完成执行。为了不这一点,用户可使用-AsJob参数使命令做为远程主机的后台任务。命令格式以下所示:
Invoke-Command -ComputerName WinServ-wfe -ScriptBlock {(Get-ChildItem D:\ -Recurse).Count} –asJob
执行后效果以下图4所示:
2041951.jpg
当用户使用带-AsJob参数的Invoke-Command cmdlet时,远程主机上的后台任务将会被建立和运行,在后台任务被建立后,可使用*-job cmdlet管理任务对象。
好比,用户可使用Get-Job监控任务的状态而且一旦任务状态变为完成,就可使用Receive-Job cmdlet获取指定脚本块的输出。
Get-Job –id 3 | Receive-Job
用户也能使用Start-Job在远程主机上用脚本块建立后台任务。然而,经过这样方式创建的任务的输出结果只会在远程主机上显示。当用户须要从该后台任务获取输出输出时,就须要在Invoke-Command调用的脚本块中使用Receive-Job cmdlet。
2.5 为远程管理指定凭据
前面的文章里,可以用在工做组中的计算机间使用PowerShell远程管理。在前面的例子中只是假定是使用管理员权限访问远程计算机,这样的方式能够在域中任何以管理员凭据登录的计算机上在域环境中很好的工做,用户不须要显式的传递凭据给Invoke-Command。然而,这样的方式是没法在工做组环境下使用,须要传递凭据给Invoke-Command,以下例所示:
$cred = Get-Credential
Invoke-Command -ComputerName WinServ-wfe -ScriptBlock { Get-Process} -Credential $cred
在上面的例子中,Get-Credential会向用户索取访问远程主机的凭据,并使用该凭据调用Invoke-Command cmdlet。
3 总结
在本文中,首先介绍了如何启用powershell的远程管理,以及如何在工做组和混合域环境下配置计算机,须要注意的是禁用远程管理不能经过Enable-PSRemoting的逆操做来实现。若是本地计算机再也不须要远程管理功能,用户须要手动撤销全部的设置,包括中止和禁用WinRM服务,移除为可信主机添加的监听器。
接下来介绍了如何使用Invoke-Command cmdlet用于在远程主机上执行命令,建立持久线程,在多个命令间同一线程传递的变量和参数。用户还能够在执行较费时的命令时之后台任务的形式实现,并在执行完毕后使用命令回调执行结果。
做者: 付海军
出处: http://fuhj02.blog.51cto.com
版权:本文版权归做者和51cto共有
转载:欢迎转载,为了保存做者的创做热情,请按要求【转载】,谢谢
要求:未经做者赞成,必须保留此段声明;必须在文章中给出原文链接;不然必究法律责任
我的网站: http://txj.shell.tor.hu/
相关文章
相关标签/搜索