PowerShell 远程执行命令
最近在做一些自动化的测试工作,在代码实现的过程中需要远程启动/关闭一些服务或者测试机。
我首先想到的是建立一个website,通过网站对一些服务进行操作,但是这样感觉比较重,而且重启一些例如IIS或者计算机的时候不是很安全。还有一种方式就是执行ssh命令或者bat命令。由于服务器是windows的,我就考虑是否可以使用PowerShell来实现。
工具
微软提供了一个一个叫WS-Management的协议,可以实现设备远程交换数据的方法。本身自带了一个叫 (Windows Remote Management service,简称 WinRM) 的服务。我们可以通过PowerShell来实现远程控制。
Host:
在host机器上我们首先检查下WinRM服务是否安装成功:
Get-Service WinRM
该服务默认情况下是开启的,如果没有开启可以到services列表里面进行开启,或者在powershell里面开启:
Enable-PSRemoting –Force
这个时候如果你的客户端和服务端的计算机都在工作域中,那么这时候的配置基本上是可以使用了。 如果不在域里面,则还需要做以下额外的操作:
Client:
在Client端执行以下命令, 将服务器机器添加到信任列表里:
Set-Item wsman:localhostclient rustedhosts *
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