windows服务器远程执行命令(PowerShell+WinRM)

Windows 远程管理 (WinRM) 是 WS-Management 协议的 Microsoft 实现。该协议是基于简单对象访问协议 (SOAP) 的、防火墙友好的标准协议,使来自不同供应商的硬件和操作系统能够互操作。WS-Management 协议由硬件和软件制造商群体开发,作为一种公共标准,可用于与实现该协议的任何计算机设备远程交换管理数据。

使用PowerShell对服务器远程管理,要在远程服务器上启用WinRM。

一、知识储备:

1、WinRM相关操作

开启WinRM服务:

Enable-PSRemoting –Force

阻止本地计算机接收远程命令(不会停止WinRM服务):

Disable-psremoting –Force

查看WinRM服务监听信息:

winrm enumerate winrm/config/Listener

WinRM2.0默认端口5985(HTTP端口)或5986(HTTPS端口)。

删除WinRM HTTP侦听:

winrm delete winrm/config/listener?Address=*+Transport=HTTP

重新建立HTTP侦听:

winrm create winrm/config/listener?Address=*+Transport=HTTP

WinRM服务更改监听端口:

set-item -force wsman:\localhost\listener\listener*\port 5985

查看WinRM的配置:

winrm get winrm/config

查看端口监听状态:

netstat -nao | findstr "5985"

2、PowerShell脚本保存凭据方法

使用Get-Credential命令来交互式输入凭据(用户名+密码),可以先将凭据保存到一个变量中,如:

$cred = get-credential

$cred的对象类型名称为:System.Management.Automation.PSCredential,其中的Password和UserName都是其属性,所以可以新建一个该类型的对象。在此处需要注意的是Password类型为SecureString,UserName类型为String,所以需要将明文的Password转换为安全字符串,可以使用ConvertTo-SecureString命令。

非交互式保存凭据代码示例:

$account = "administrator"  
$password = ‘123456‘  
$secpwd = convertto-securestring $password -asplaintext -force  
$cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd

3、Invoke-Command

Invoke-Command在本地和远程计算机上运行命令,并从命令返回所有输出,包括错误。使用一个Invoke-Command命令,可以在多台计算机上运行命令。部分参数介绍:

-Port <int>

指定远程计算机上用于此命令的网络端口。用于WinRM默认监听端口被更改的情况下,指定新的端口。

-ComputerName <string[]>

指定运行此命令的计算机。默认值为本地计算机。

使用 ComputerName 参数时,Windows PowerShell 会创建一个临时连接,此连接仅用于运行指定的命令,之后将关闭。如果需要持续性连接,请使用 Session 参数。

在一个逗号分隔列表中键入一台或多台计算机的 NETBIOS 名称、IP 地址或完全限定的域名。要指定本地计算机,请键入计算机名称、“localhost”或句点 (.)。

若要在 ComputerName 参数的值中使用 IP 地址,命令必须包括 Credential 参数。另外,必须为计算机配置 HTTPS 传输,或者必须在本地计算机上的 WinRM TrustedHosts 列表中包含远程计算机的 IP 地址。

-Session <PSSession[]>

在指定的 Windows PowerShell 会话 (PSSession) 中运行此命令。

通过创建 PSSession,Windows PowerShell 可以建立与远程计算机的持续性连接。

-Credential <PSCredential>

指定有权执行此操作的用户帐户。默认值为当前用户。

-command/-ScriptBlock <scriptblock>

指定要运行的命令。用大括号 ({ }) 括起命令以形成脚本块。

-FilePath <string>

在一台或多台远程计算机上运行指定的本地脚本。

-AsJob

在远程计算机上将命令作为后台作业运行。使用此参数可运行需要较长时间才能完成的命令。

使用 AsJob 时,此命令返回代表作业的对象,然后显示命令提示符。要管理作业,请使用 Job cmdlet。要获取作业结果,请使用 Receive-Job。

-ThrottleLimit <int>

指定为运行此命令可建立的并发连接的最大数目。如果省略此参数或输入 0 值,则使用默认值 32。

4、PSSession

PSSession即Windows PowerShell会话。当你需要与远程计算机的持续连接时,则使用PSSession。PSSession相关命令:

Enter-PSSession

启动与远程计算机间的交互式会话。

New-PSSession

创建PSSession,并返回一个表示PSSession的对象。你可以将对象保存在变量中。

Get-PSSession

获取当前会话中创建的PSSession。Get-PSSession返回与New-PSSession返回的对象相同类型的对象。

Remove-PSSession

删除 PSSession 并释放其正在使用的资源。

5、将计算机名称添加到TrustedHosts列表

若要将所有计算机添加到受信任主机列表,请使用以下命令 :

set-item wsman:localhost\client\trustedhosts -Force -value *

还可以使用通配符 (*) 将特定域中的所有计算机添加到受信任主机列表。

例如,以下命令将Fabrikam域中的所有计算机添加到受信任主机列表。

set-item wsman:localhost\client\trustedhosts *.fabrikam.com

若要将特定计算机的 IP 地址添加到受信任主机列表,请使用以下命令格式(IP支持通配符*):

set-item wsman:\localhost\Client\TrustedHosts -value "<IP Address>[,<IP Address>]"

若要查看受信任主机列表,请使用以下命令:

get-item wsman:\localhost\Client\TrustedHosts

二、远程操作常见场景

场景一:远程交互式会话

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

场景一例子:
# 用户输入凭据(用户名+密码)
$cred=get-Credential
# 建立远程交互式会话
Enter-PSSession -computername 192.168.21.1 -Credential $cred

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

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

场景二例子、
# 用户输入凭据(用户名+密码)
$cred=get-Credential
# 远程执行命令
invoke-command -computername 192.168.21.1 -Credential $cred -command {dir C:/}
invoke-command -computername 192.168.21.1 -Credential $cred -ScriptBlock {dir c:\}
# 远程执行脚本
echo "dir c:\" > dirDriveC.ps1
invoke-command -computername 192.168.21.1 -Credential $cred  -FilePath .\dirDriveC.ps1

场景二例子(多个远程主机)、
# 用户输入凭据(用户名+密码)
$cred=get-Credential
# 对多个远程主机批量执行命令
invoke-command -computername 192.168.21.1,192.168.21.4,192.168.21.7 -Credential $cred -ScriptBlock {dir c:\}
# 设置并发连接数设置为1的情况
invoke-command -computername 192.168.21.1,192.168.21.4,192.168.21.7 -Credential $cred -ThrottleLimit 1 -ScriptBlock {dir c:\}

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

1、定义会话: 请使用new-pssession命令定义会话,如$session1 = new-pssession -computername 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继续执行,所有执行的命令就好像在同一个上下文中执行一样。

场景三例子、
# 用户输入凭据(用户名+密码)
$cred=get-Credential
# 创建PSSession,并赋值给变量
$session1 = new-pssession -computername 192.168.21.1 -Credential $cred
# 远程执行命令(持续性)
Invoke-Command -Session $session1 -ScriptBlock {$a="hello world"}
Invoke-Command -Session $session1 -ScriptBlock {$a}

场景三例子(多个远程主机)、
# 用户输入凭据(用户名+密码)
$cred=get-Credential
# 对多个远程主机创建PSSession,并赋值给变量
$session_many = new-pssession -computername 192.168.21.1,192.168.21.4,192.168.21.7 -Credential $cred
# 对多个远程主机批量执行命令
Invoke-Command -Session $session_many -ThrottleLimit 1 -ScriptBlock {dir c:\}
场景三例子(脚本方式)、
$account = "administrator"
$password = ‘123456‘
# 把密码转换为SecureString
$secpwd = convertto-securestring $password -asplaintext -force
# 新建PSCredential对象
$cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd
# 远程主机列表赋值给变量
[string[]]$computername="192.168.21.1","192.168.21.4","192.168.21.7"
# 创建PSSession
$session_many = new-pssession -computername $computername -Credential $cred
# 批量远程执行命令
Invoke-Command -Session $session_many -ThrottleLimit 1 -ScriptBlock {dir c:\}

参考资料:

https://technet.microsoft.com/zh-cn/library/dd347578.aspx

https://technet.microsoft.com/zh-cn/library/hh847839.aspx

https://technet.microsoft.com/zh-cn/library/dd347642.aspx

http://www.cnblogs.com/ceachy/archive/2013/02/20/PowerShell_Remoting.html

时间: 2024-10-06 03:33:13

windows服务器远程执行命令(PowerShell+WinRM)的相关文章

一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)

作为一个后台程序猿,经常需要把一堆程序集(DLL)或者应用程序(EXE)复制到多个服务器上,实现程序的代码逻辑更新,用以测试新的功能或改动逻辑.这里给大家介绍一个自己实现的PowerShell脚本,方便大家替换DLL或者EXE到多个Windows机器上. 一.   脚本用途 用于方便复制多个文件到多个服务器上. 二.   脚本功能 脚本的主要功能如下: 支持通过最后修改时间过滤文件,设定时间之前的文件不进行复制操作(逻辑设计源于Rebuild代码后只替换新Build出来的有改动的文件): 支持多

ssh远程连接linux服务器并执行命令

详细方法: SSHClient中的方法 参数和参数说明 connect(实现ssh连接和校验) hostname:目标主机地址 port:主机端口 username:校验的用户名 password:登录密码 pkey:私钥方式身份验证 key_filename:用于私钥身份验证的文件名 timeout:连接超时设置 allow_agent:这是布尔型,设置False的时候禁止使用ssh代理 look_for_keys:也是布尔型,禁止在.ssh下面找私钥文件 compress:设置压缩 exec

python模块paramiko的上传下载和远程执行命令

#!/usr/bin/python # -*- coding: utf-8 -*- import paramiko,os,datetime server_ip = '192.168.1.123' server_user = 'root' server_passwd = '10241010' server_port = 22 #local_dir='C:\Python27' #remote_dir='/soft2/nba/' def ssh_connect(): ssh = paramiko.SS

Linux监控平台(主被动模式,添加监控主机,添加图形,处理图形乱码,远程执行命令)

一.主动模式和被动模式(针对客户端) 主动模式:客户端使用完数据后,每隔自定义事件主动上报给服务端 应用环境:当客户端数量非常多,建议使用主动模式,这样可以降低服务端的压力. 被动模式:服务端会主动连接客户端,客户端被动连接,把监控信息传递给服务端 应用环境:服务端有公网ip,客户端只有内网ip,但是能连接外网,可以主动上报. 这种场景适合主动模式. 二.添加监控主机 添加主机: 再添加主机之前,我们要先添加一个主机群组,在配置中 主机群组的右上角有一个创建主机 然后点主机,右上角有一个创建主机

saltstack在windows客户端远程执行脚本提示路径不对的问题

saltstack在windows客户端远程执行脚本提示路径不对的问题 环境: salt-master ==2018.3.0 salt-minion ==2018.3.0 python== 2.7.5 centos==7 问题描述: salt有个远程执行命令的模块cmd.script,在使用该模块时,出现错误: salt 'minion-id' cmd.script salt://test.ps1 shell=powershell 其中salt://为/etc/salt.conf定义的base路

python 网络编程(远程执行命令与粘包)

远程执行命令 先来学习一个新模块 , 一会用到的.. 新模块: subprocess 执行系统命令 r = subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) subprocess.Popen(a,b,c,d) a: 要执行的系统命令(str) b: shell = True 表示确定我当前执行的命令为系统命令 c: 表示正确信息的输出管道 d: 表示错误信息的输出管道 下边直接上代码,

102 模拟ssh远程执行命令

目录 一.subprocess模块 1.1 使用方法 二.模拟实现SSH远程执行命令 服务器 客户端 一.subprocess模块 subprocess 模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入.标准输出.标准错误以及返回码等.更多查看官网:https://docs.python.org/2/library/subprocess.html?highlight=subprocess#frequently-used-arguments 可以通过subproces

100 模拟ssh远程执行命令

目录 一.subprocess模块 1.1 使用方法 二.模拟实现SSH远程执行命令 服务器 客户端 一.subprocess模块 subprocess 模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入.标准输出.标准错误以及返回码等.更多查看官网:https://docs.python.org/2/library/subprocess.html?highlight=subprocess#frequently-used-arguments 可以通过subproces

使用ansible远程执行命令

使用ansible远程执行命令 1.ansible简介 ansible的官方定义:"Ansible is Simple IT Automation"--简单的自动化IT工具.这个工具的目标: 自动化部署APP 自动化管理配置项 自动化的持续交付 自动化的(AWS)云服务管理. 其本质上就是在远程在多台服务器执行一系列命令和文件同步,和以前的介绍的使用并行ssh提高工作效率功能类似,他们都是使用ssh协议进行远程操作,但ansible比pssh功能更强大,比如支持主机列表分组.支持pla