Windows远程管理WinRM,Enter-PSSession
前置条件
启用PowerShell远程管理:
1)在本地计算机(需要管理远程计算机的计算机)上运行Set-item wsman:localhost\client\trustedhosts –value *,添加trusthost列表
2)在远程计算机(需要被远程管理的计算机上)上运行Enable-PSremoting -force即可
开启与关闭WinRM
Enable-PSremoting
Disable-PSremoting
如果要启用PS远程管理,此时网络位置不能被设置为public,因为Windows 防火墙例外不能在网络位置是public时被启用。
检查服务端
检查远程服务器上的WINRM服务是否在运行:
test-wsman -computername server01
test-wsman -authentication default
#该命令等同于 winrm id -remote:server01,只是没有返回OS版本
#检查winrm服务是否在本地计算机上运行,通过-authentication参数可以得出OS版本号
test-wsman -authentication default
#检查winrm服务是否在本地计算机上运行
test-wsman
Test-WSMan cmdlet 提交一个识别请求以确定 WinRM 服务是在本地计算机还是远程计算机上运行。如果接受测试的计算机正在运行该服务,则该 cmdlet 将显示被测服务的 WS-Management 标识方案、协议版本、产品供应商及产品版本
使用 authentication 参数进行测试以了解 WS-Management (WinRM) 服务是否正在本地计算机上运行。使用 authentication 参数可允许 Test-WSMan cmdlet 返回操作系统的版本
检查WinRM服务监听状态
winrm enumerate winrm/config/listener
检查WinRM配置情况
winrm get winrm/config
配置服务端
服务器配置WinRM的命令
方法一
0.配置计算机以接收远程命令(需要远程确认)
Enable-PSRemoting
1. 在服务器上以管理员权限运行启用PowerShell远程访问(配置计算机以在没有确认提示的情况下接收远程命令)
Enable-PSRemoting -Force
Enable-PSRemoting -SkipNetworkProfileCheck -Force # 在计算机位于公用网络上时在Windows客户端版本上启用PowerShell远程处理
# 在此计算机上设置了 WinRM 以接收请求。
# WinRM 已经进行了更新,以用于远程管理。
# WinRM 防火墙异常已启用。
# 已配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。
# 警告: 正在等待服务“Windows Remote Management (WS-Management) (winrm)”停止.
# 2.如何在Windows操作系统的客户端版本上允许从公共网络进行远程访问,对于不同版本的Windows,防火墙规则的名称可能不同;
# NetSecurity模块中的Set-NetFirewallRulecmdlet添加了防火墙规则,该规则允许从任何远程位置从公共网络进行远程访问
Get-NetFirewallRule -Name 'WINRM*' | Select-Object Name
# Name
# ----
# WINRM-HTTP-In-TCP-NoScope
# WINRM-HTTP-In-TCP
# WINRM-HTTP-Compat-In-TCP-NoScope
# WINRM-HTTP-Compat-In-TCP
# 建议指定远程连接的主机
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-NoScope" -RemoteAddress 10.20.172.103
# 如果安全组有限制, 请开放对此机器入方向的5985(HTTP)和5986(HTTPS)端口。
New-NetFirewallRule -Name powershell-remote-tcp -Direction Inbound -DisplayName 'PowerShell远程连接 TCP' -LocalPort 5985-5996 -Protocol 'TCP' -RemoteAddress 10.20.70.88
New-NetFirewallRule -Name powershell-remote-udp -Direction Inbound -DisplayName 'PowerShell远程连接 UDP' -LocalPort 5985-5996 -Protocol 'UDP' -RemoteAddress 10.20.70.88
# 3.在客户端机器上(需要远程连接被管理的机器上)运行以下命令以接受被管理的机器是受信任的 (如果想管理任何机器请设置为*), 运行以下命令必须是管理员权限
PS > Get-Service -Name WinRM | Start-Service
PS > Set-Item WSMan:localhost\client\trustedhosts -value 10.20.172.106 -Force
PS > Enter-PSSession -ComputerName 10.20.172.106 -Credential weiyigeek
# [10.20.172.106]: PS C:\Users\WeiyiGeek\Documents> hostname
# Security
# [10.20.172.106]: PS C:\Users\WeiyiGeek\Documents> Get-NetAdapter
# Name InterfaceDescription ifIndex Status MacAddress LinkSpeed
# ---- -------------------- ------- ------ ---------- ---------
# VMware Network Adapte...1 VMware Virtual Ethernet Adapter for ... 16 Up 00-50-56-C0-00-01 100 Mbps
# 以太网 Intel(R) Ethernet Connection (11) I2... 12 Up B0-7B-25-05-9E-DE 1 Gbps
# VMware Network Adapte...8 VMware Virtual Ethernet Adapter for ... 4 Up 00-50-56-C0-00-08 100 Mbps
方法二
#开启WinRm
Enable-PSremoting
#运行Enable-PSRemoting,提示如下:
#WinRM 快速配置
#正在运行命令“Set-WSManQuickConfig”,以便通过 Windows 远程管理(WinRM)服务对该计算机进行远程管理。
#其中包括:
#1. 启动或重新启动(如果已启动) WinRM 服务
#2. 将 WinRM 服务启动类型设置为“自动”
#3. 创建侦听程序以接受任意 IP 地址上的请求
#4. 为 WS-Management 通信启用 Windows 防火墙入站规则例外(仅适用于 http)。
#5.默认情况下,WinRM只启用http传输用于接收远程请求。用户可以使用winrm命令或New-WSManIntance cmdlet手动启用https传输。
winrm quickconfig
#运行 winrm quickconfig,提示如下:
#执行配置操作以使此计算机能够进行远程管理。
#其中包括:
#1. 启动 WinRM 服务
#2. 将 WinRM 服务类型设置为自动启动
#3. 创建侦听程序以接受任意 IP 地址上的请求
#4. 为 WS-Management 通信启用防火墙例外(仅适用于 http)
#加上''号后可以在PS下执行 '@{Basic=“true”}',否则在CMD下执行
winrm set winrm/config/service/auth '@{Basic=“true”}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
#查看TrustedHost列表 连接端执行而不是服务器端
Get-Item WSMan:\localhost\Client\TrustedHosts
#添加TrustedHost列表 连接端执行而不是服务器端
Set-Item WSMan:\localhost\Client\TrustedHosts -Value '*'
远程连接
使用本地计算机连接到远程服务器的Powershell
#连接到远程服务器的Powershell
Enter-PSSession 10.20.3.51 -Credential lianlianpay\wuqh
#远程连接可能遇到的问题及解决办法
#Enter-PSSession : 连接到远程服务器失败,错误消息如下: WinRM 客户端无法处理该请求, 执行如下命令,将IP为192.168.3.的主机都加入信任列表Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.3.注意这个命令需要在 客户端上执行 不是在服务端执行 且客户端需要已管理员权限执行,这一点许多教程没有说,走了不少弯路。
Set-Item wsman:\localhost\Client\TrustedHosts -value 10.20.3.*
#Enter-PSSession:连接到远程服务器myniceaspp.cloudapp.net失败,并显示以下错误消息:访问被拒绝.有关详细信息,请参阅about_Remote_Troubleshooting帮助主题.
#有类似的问题.建议您仔细检查您正在连接的用户是否在远程计算机上具有适当的授权.您可以使用以下命令查看权限.
#查看哪些用户具有访问权限
(Get-PSSessionConfiguration -Name Microsoft.PowerShell).Permission
#修改用户访问权限
Set-PSSessionConfiguration -ShowSecurityDescriptorUI -Name Microsoft.PowerShell
禁用远程管理
用户可以使用Disable-PSRemoting在本地主机上禁用远程管理。Disable-PSRemoting将会使线程配置信息失效,这样的操作并不会移除所有
Enable-PSRemoting创建的配置,包括WinRM的启用状态和为PS远程管理创建的监听器。
如果在本机上没有任何服务或组件需要WinRM服务,用户可以通过执行下列命令禁用WinRM服务:
Set-Service winrm -StartupType Manual
Stop-Service winrm
为了移除默认情况下WinRM在5985端口设置的监听器可以执行的下述命令:
Get-ChildItem WSMan:\localhost\Listener –Recurse | Foreach-Object { $_.PSPath } | Where-Object { (Get-Item "$_\Port").Value -eq 5985 } | Remove-Item
问题
在现在GUI形式的Windows上,若使用域控账号或Administrator执行远程管理,由于Windows将域账户认为是可信账户,因此无需任何配置,即可完美执行远程命令。
但要想使用本地非Administrator账号通过WinRM进行远程管理,会受到UAC(User Account Control)的影响,当使用非Administrator账号执行任何操作时,均会弹出UAC确认窗口,需要用户手动点击“是”按钮进行确认,如下图:
那么问题来了:在执行远程命令时,运维人员并没有进到操作系统界面,无法看到此提示,更不用说确认了,必然导致远程命令执行失败。
针对此问题,微软提供了一种远程操作关闭UAC提示的策略配置,只需要在注册表中配置LocalAccountTokenFilterPolicy = 1,即可在远程执行命令时,不进行UAC提示,但此策略不影响Windows本地操作,因此具有一定安全性。
具体配置操作为以管理员身份打开CMD,并执行以下命令:
reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
进行上述配置后,使用本地非管理员账号,也可完美远程执行命令。
lianlianpay避坑指南
accountapi帐户在其它电脑上使终登录不成功,提示为:
经排查有以下三点原因:
-
未加入Remote Management Users组,导致远程无法登录成功;
-
未开启登录端机器验证导致登录失败(即限制此accountapi帐户登录源),将需要登录的计算机名加入进来即可;
-
通过以上两个授权可以正常登录了,但是还是无法查询修改DNS
原因为只给了DNSAdmin不行,必须得给Domain Admin域超管的权限
参考:https://cloud.tencent.com/developer/article/2129447