最近在做一些自动化的测试工作,在代码实现的过程中需要远程启动/关闭一些服务或者测试机。
我首先想到的是建立一个website,通过网站对一些服务进行操作,但是这样感觉比较重,而且重启一些例如IIS或者计算机的时候不是很安全。还有一种方式就是执行ssh命令或者bat命令。由于服务器是windows的,我就考虑是否可以使用PowerShell来实现。
微软提供了一个一个叫WS-Management的协议,可以实现设备远程交换数据的方法。本身自带了一个叫 (Windows Remote Management service,简称 WinRM) 的服务。我们可以通过PowerShell来实现远程控制。
在host机器上我们首先检查下WinRM服务是否安装成功:
Get-Service WinRM
该服务默认情况下是开启的,如果没有开启可以到services列表里面进行开启,或者在powershell里面开启:
Enable-PSRemoting –Force
这个时候如果你的客户端和服务端的计算机都在工作域中,那么这时候的配置基本上是可以使用了。 如果不在域里面,则还需要做以下额外的操作:
在Client端执行以下命令, 将服务器机器添加到信任列表里:
Set-Item wsman:\localhost\client\trustedhosts * Restart-Service WinRM
测试以下,服务通讯是否成功:
Test-WsMan xxx.xxx.xxx.xxx
看到类似上面的信息,就表示两个计算机之间的通讯是通畅的。
如果出现以下错误:
根据提示去server端运行 winrm quickconfig,然后一路默认即可:
然后我们就可以尝试使用命令远程连接计算机了:
Enter-PSSession -ComputerName 10.112.20.84 -Credential administrator
在弹出的登录框中输入host的密码就可以登录远程计算机了:
但是这种方式需要手工输入密码,不是很方便,我们只需要将这些用户名密码参数化就可以实验脚本化登录了:
$Username = '*********' $PWD = '********' $pass = ConvertTo-SecureString -AsPlainText $PWD -Force $Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass Invoke-Command -ComputerName 10.112.20.84 -ScriptBlock { iisreset } -credential $Cred
https://www.cnblogs.com/makesense/p/12820404.html
PowerShell主要采用Web Services for Mangement(WS-MAN)进行远程处理,WS-MAN完全基于Http(默认5985)或者Https(默认5986)进行工作,这样保证在需要的情况下,能够轻易透过防火墙进行作业(因为每种协议都使用唯一的端口进行通信)。微软对WS-MAN的实现是Windows Remote mangement(WinRM)。WinRM是一个基于SOAP的后台服务。
PowerShell连接常规远程主机
1. 在远程机器上以Administrator角色打开PowerShell执行以下命令,启动允许远程连接
Enable-PsRemoting
2. 在客户机器 (本地) 执行以下命令,将远程机器IP地址加入可信主机列表
Set-Item wsman:\localhost\Client\TrustedHosts -value
3. 在客户机器 (本地) 输入以下命令, 在弹出对话框输入密码,以交互的方式连接远程主机
Enter-PSSession -ComputerName-Credential
4. PowerShell远程命令的基本使用见官方文档: Running Remote Commands
使用PowerShell以Http方式连接Azure虚拟机
1. 同以上常规连接远程主机设置
1. 若虚拟机安全受网络完全组(Network Security Group)管控,设置允许5985入栈
2. 若虚拟机绑定了负载均衡器(load balancer),为5985端口设置入站NAT规则(Inbound NAT Rules), 或者为了隐藏实际端口,为5985端口运行状况探测(probes)和负载均衡规则(load Balancing Rules)
使用PowerShell以Https方式连接Azure虚拟机
1. 同以上常规连接远程主机设置
2. 打开Azure远程虚拟机(Windows)防火墙设置,设置允许5986入栈
3. 若虚拟机安全受网络完全组(Network Security Group)管控,设置允许5986入栈
4. 若虚拟机绑定了负载均衡器(load balancer),为5986端口设置入站NAT规则(Inbound NAT Rules),或者为了隐藏实际端口,为5986端口运行状况探测(probes)和负载均衡规则(load Balancing Rules)
5. 需使用以下命令连接远程主机, 详细参数设置见: Enter-PSSession
# 设置会话,忽略远程机器的SSL证书验证 $SessionOption = New-PsSessionOption SkipCACheck -SkipCNCheck Enter-PSSession -ConnectionUri https://:5986 -Credential -SessionOption $SessionOption # 另一种参数形式 Enter-PSSession -ComputerName -Port 5986 -UseSSL -Credential -SessionOption $SessionOption
从PowerShell 6开始,除了WS-MAN之外,远程处理技术还可以基于SSH协议。在最新的Windows 10和Windows Server 2019中,可以使用OpenSSH连接远程机器,详细文档参见:PowerShell remoting over SSH and OpenSSH in Windows, 另外,OpenSSH客户端在最新的Windows 10和Windows Server 2019中已默认安装,在 设置\应用\可选功能 列表下可以找到(见下图), 可以通过上方的添加功能按钮安装OpenSSH服务器。
更多参考:
1. Enable PowerShell remoting on Azure RM virtual machines
2. Copy files to Azure VM using PowerShell Remoting
3. Secrets of PowerShell Remoting
3. 远程管理WinRM,Enter-PSSession (Enable-PSRemoting = Set-WSManQuickConfig = winrm quickconfig)
4. PowerShell 远程执行任务
5. Windows开启WinRM服务
标签: PowerShell