主要使用的是PowerShell Remoting 的功能,需要两台主机都安装有PowerShell。
功能启用
这个在 Windows Server 2012 R2 之后都是默认启用的。Windows 10上需要手动开启,管理员权限运行Enable-PSRemoting -Force
WinRM
Windows Server的PowerShell Remotiong默认使用的是 WinRM 协议。这个协议基于一个开放标准Web Services for Management(简称 WS-Management)。Windows添加这个支持还蛮早,08年提出的,XP都支持。除了Windows,好像没什么人使用这个标准了,毕竟这个是面向Web服务的,而Web服务可以选择的太多了。后面如果说WSMan其实就是WinRM。微软还弄了个Linux上的WSMan,叫作 Open Management Infrastructure但是看起来已经弃坑了,所以可以认为这项技术是Windows Only了。
WinRM 是基于HTTP或HTTPS的SOAP协议,标准端口是80和443,但是Windows7之后都默认使用5985和5986。
有些PowerShell命令有个ComputerName的参数,可以让命令在远程主机上执行,这些命令使用的是RPC协议。它们和PowerShell Remoting是不同的。这些命令可以使用一下命令查看
Get-Command | Where-Object {
$_.Parameters.Keys -contains "ComputerName" -and
$_.Parameters.Keys -notcontains "Session"
}
OpenSSH
微软在18年fork了OpenSSH,18年底后的Windows版本(包括Windows Server)都内置了openssh的客户端,但是服务端需要额外启用。PowerShell Remoting 可以使用 ssh 协议连接,这样就跨平台了,比如在macOS或者Linux中来远程Windows服务器。当然如果开启了ssh server,我们也可以直接 ssh 到远程主机了!并不一定需要使用PowerShell的远程功能。
认证
如果使用主机名来连接,默认使用的是 Kerberos 协议,这个是双向认证的,即也会检查服务器是否可信。
如果使用的是IP或者连到工作组服务器,这个使用使用的是 NTLM。NTLM默认没有启用!所以要么在远程主机上设置SSL,要么在客户端设置信任主机。
信任主机
服务器往往没有配置SSL,NTLM协议无法验证服务器的身份,为了安全,需要在发起端信任远程主机,运行
Set-Item wsman:\localhost\client\trustedhosts *
Restart-Service WinRM
上面使用了通配符,任何服务器都会信任。
服务器WinRM设置
Windows Server 上默认启动了winrm服务(Get-Service winrm),但是有服务不一定能工作,需要有listener,也就是能处理WSMan协议报文的服务。
查看当前的监听服务(listener)
winrm enumerate winrm/config/listener
查看配置
winrm get winrm/config
快速配置
winrm quickconfig
测试连接
Test-WsMan Server-COMPUTER
临时远程运行命令
Invoke-Command -ComputerName Server01,Server02 -ScriptBlock { COMMAND } -credential USERNAME
开启远程会话,持续运行命令
Enter-PSSession -ComputerName COMPUTER -Credential USER
创建一个持久的连接
$s = New-PSSession -ComputerName Server01, Server02
Invoke-Command -Session $s { powershell-command-run-on-remote }
传输文件
利用持久连接,可以使用Copy-Item向或者从远程主机拷贝文件!最大的痛点解决了!
$Session = New-PSSession -ComputerName "Server01" -Credential "Contoso\User01"
Copy-Item "D:\Folder001\test.log" -Destination "C:\Folder001_Copy\" -ToSession $Session
Copy-Item "C:\MyRemoteData\scripts" -Destination "D:\MyLocalData\" -FromSession $Session
其他设置
如果遇到以下错误: Enter-PSSession: Connecting to remote server x.x.x.x failed with the following error message : WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入到域中, 则必须使用 HTTPS 传输或者必须将目标计算机添加到 TrustedHosts 配置设置。 使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。 通过运行以下命令可获得有关此内容的更多信息: winrm help config。 For more information, see the about_Remote_Troubleshooting Help topic.
使用winrm quickconfig -transport:https
转换传输协议,然后确保设置对信任主机即可。