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 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所示:
当用户使用带-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用于在远程主机上执行命令,创建持久线程,在多个命令间同一线程传递的变量和参数。用户还可以在执行较费时的命令时以后台任务的形式实现,并在执行完毕后使用命令回调执行结果。
本文转自天鬼皇 51CTO博客,原文链接:http://blog.51cto.com/ghostlan/1384354,如需转载请自行联系原作者

PowerShell 远程管理之启用和执行命令相关推荐

  1. powershell远程管理

    简介 在一定程度上讲powershell 远程管理类似域Telent或者其他一些老旧的远程处理技术,它会在远程计算机上面执行相关命令,并将结果返回本地计算机,powershell远程管理使用的是针对管 ...

  2. PowerShell远程管理Windows Server(2):公网访问【web形式】

    *此文章只适合于windows server 2012版本以上: Powershell Web Access需要两个步骤才能使用: 一.安装powershell web access功能: 二.配置p ...

  3. PowerShell:远程管理中的多跳问题之CredSSP详解

    前言 在我的博客PowerShell: 远程管理除了知道Invoke-Command,还应该掌握Enter-PSSession这个命令_码农杰克-CSDN博客 种曾经提到执行使用PowerShell执 ...

  4. java远程执行功能_Java远程连接Linux服务器并执行命令及上传文件功能

    Java远程连接Linux服务器并执行命令及上传文件功能 发布于 2020-3-6| 复制链接 摘记:  最近再开发中遇到需要将文件上传到Linux服务器上,至此整理代码笔记.此种连接方法中有考虑到并 ...

  5. Powershell远程管理服务器客户端

    目录 域中计算机远程管理 1.管理员权限运行Powershell,输入Enable-PsRemoting开启Powershell远程管理 2.S12-1Powershell远程管理S12-2

  6. 使用Powershell远程管理Windows Server(WinRM)

    在Linux中,我们可以使用安全的SSH方便的进行远程管理.但在Windows下,除了不安全的Telnet以外,从Windows Server 2008开始提供了另外一种命令行原创管理方式,那就是基于 ...

  7. ansible启用sudo执行命令

    今天又一个要求,想通过sudo的普通用户执行ansible的命令,而不是通过root用户去执行系统管理的命令.步骤如下 一.先修改ansible.cfg文件,启用sudo,指定sudo的用户为lisi ...

  8. php使用ssh远程调用另一个服务器执行命令(python脚本)

    文章目录 一.前言 二.具体步骤 1.php使用exec函数调用命令行 2.ssh跨机器执行命令 (1)登录到另一台机器 (2)登录且执行命令 3.复制秘钥文件并赋予权限 4.复制py文件到指定机器的 ...

  9. 执行远程linux命令,linux shell 远程执行命令

    经常要部署多台服务器上面的应用,如果一个个机器的登录太麻烦. 所有就想到编写一个脚本来部署不同的服务器 前提条件: 配置ssh免登陆 如果不会的请参加我的另外一篇文章 http://blog.csdn ...

最新文章

  1. 机器学习中的没有免费的午餐定律是什么?“没有免费的午餐”对你意味着什么?没有免费午餐定律定律能给数据科学家提供什么启示?
  2. 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数...
  3. Apache开源项目
  4. java客户端服务器代码_Java Socket通信 客户端服务器端基本代码
  5. 浏览器播放rtsp视频流方案(ffmpeg + nginx转m3u8)
  6. ncsi信号测试软件,02-附录
  7. 微信小程序实现图片翻转效果
  8. 游戏服务器架构演化史
  9. spring cloud alibaba全家桶集合
  10. signature=32d532a97f37c02b1149992578cf4af9,~(11)C-CFT PET功能显像Parkin基因缺陷少年型帕金森病患者脑多巴胺转运体...
  11. 浅谈CAS,一篇就够了
  12. 2019.10.15
  13. CSR867x — 广播数据设置接口以及如何添加厂商数据
  14. C# UDP实现数据收发
  15. 不可不知的JavaScript面向对象
  16. JAVA输出希腊union,希腊十大旅游胜地(上)
  17. 基于Android的股票交易软件,基于android的股票交易系统的融资融券交易子系统的设计与实现-软件工程专业论文.docx...
  18. 【EI检索】第二届传感器与信息技术国际学术会议(ICSI2022)
  19. 计算机科学与技术专业相关英语论文,计算机科学与技术专业 毕业论文 外文翻译中英文对照.doc...
  20. 多平台视频PC端下载(持续更新,windows)

热门文章

  1. python抓取微信公众号新闻文章图片
  2. 30位烈士葬身火海,请记住英雄的名字!
  3. MFC学习(一)——ADO数据库编程
  4. 程序员养成架构师之路
  5. 利用互斥锁和条件变量实现生产者消费模型
  6. iOS App被拒原因
  7. e.g. i.e. etc. et al. w.r.t. i.i.d.英文论文中的缩写语
  8. 闪烁之光为什么闪退_闪烁之光抖音版
  9. Silverlight技术应用,打造我的动感相册 (续)
  10. 影像篡改与识别(一):胶片时代