设为首页 收藏本站
查看: 847|回复: 0

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

[复制链接]

尚未签到

发表于 2018-9-2 14:40:32 | 显示全部楼层 |阅读模式
  作者: 付海军
  出处:http://fuhj02.blog.51cto.com
  PowerShell 2.0的远程管理功能很强大,为了方便读者学习这里首先介绍学习环境的设置,便于读者在理解原理的同时有相对形象的体验。在本文中,将会分别介绍了如何启用和禁用powershell的远程管理,以及如何在工作组和混合域环境下配置计算机。以及如何使用Invoke-Command cmdlet用于在远程主机上执行命令,创建持久线程,在多个命令间同一线程传递的变量和参数。用户还可以在执行较费时的命令时以后台任务的形式实现,并在执行完毕后使用命令回调执行结果。
1 启用和禁用远程管理PowerShell 2.0中能通过在PowerShell提示符下执行下列的cmdlet启用远程管理PS C:\> Enable-PSRemoting该cmdlet会向用户询问几个问题如下图1所示当执行该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所示的提示符:【提示】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所示:修改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 11.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 ManualStop-Service winrm为了移除默认情况下WinRM在5985端口设置的监听器可以执行的下述命令:Get-ChildItem WSMan:\localhost\Listener –Recurse | Foreach-Object { $_.PSPath } | Where-Object { (Get-Item "$_\Port").Value -eq 5985 } | Remove-Item2 执行远程命令在远程管理的情况下,有两种方式在远程主机上运行命令或脚本。包括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-wfeInvoke-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所示:当用户使用带-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-CredentialInvoke-Command -ComputerName WinServ-wfe -ScriptBlock { Get-Process} -Credential $cred在上面的例子中,Get-Credential会向用户索取访问远程主机的凭据,并使用该凭据调用Invoke-Command cmdlet。3 总结在本文中,首先介绍了如何启用powershell的远程管理,以及如何在工作组和混合域环境下配置计算机,需要注意的是禁用远程管理不能通过Enable-PSRemoting的逆操作来实现。如果本地计算机不再需要远程管理功能,用户需要手动撤销所有的设置,包括停止和禁用WinRM服务,移除为可信主机添加的监听器。接下来介绍了如何使用Invoke-Command cmdlet用于在远程主机上执行命令,创建持久线程,在多个命令间同一线程传递的变量和参数。用户还可以在执行较费时的命令时以后台任务的形式实现,并在执行完毕后使用命令回调执行结果。赛迪网地址:http://tech.ccidnet.com/art/302/20100701/2102911_1.html作者: 付海军  出处:http://fuhj02.blog.51cto.com
  版权:本文版权归作者和51cto共有
  转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
  要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  个人网站: http://txj.shell.tor.hu/


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-561693-1-1.html 上篇帖子: 微软私有云分享(R2)16PowerShell查看虚拟机信息 下篇帖子: Windows脚本初探之PowerShell流程控制while
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表