PowerShell 远程执行命令


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:\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