如果该服务被禁用或访问被 Windows Defender 防火墙阻止,则会出现错误:
Test-WsMan WSManFault:WinRM 无法完成操作。验证指定的计算机名称是否有效、该计算机是否可通过网络访问、WinRM 服务的防火墙例外是否已启用并允许从此计算机进行访问。默认情况下,公共配置文件的 WinRM 防火墙例外限制对同一本地子网内的远程计算机的访问。
因此,要通过 PowerShell 远程启用远程桌面,远程计算机必须满足以下要求:
- WinRM 服务应该启动;
- 您必须拥有远程设备的管理员权限;
- 具有高级安全规则的 Windows Defender 防火墙必须接受 WinRM 端口 Tcp 5985 和 5986 上的 PowerShell 远程处理。您可以使用以下命令启用 WinRM 防火墙规则:netsh advfirewall 防火墙设置规则组=“Windows 远程管理”新启用=yes)
假设您要在 Windows Server 2022/2019/2016/2012R2 上远程启用 RDP。打开计算机上的PowerShell控制台并运行以下命令远程连接到服务器:
Enter-PSSession -ComputerName server.domain.local -Credential domainadministrator
提示:Enter-PSSession 和 Invoke-Command cmdlet 允许您通过 WinRM 在远程计算机上运行 PowerShell 脚本。
现在,您已经与计算机建立了远程会话,现在可以对其运行 PowerShell 命令。要启用远程桌面,只需将注册表参数fDenyTSConnections从1更改为0即可。运行命令:
Set-ItemProperty -Path 'HKLM:SystemCurrentControlSetControlTerminal Server'-name "fDenyTSConnections" -Value 0
当以这种方式(与 GUI 方法相反)启用 RDP 时,您需要手动启用远程桌面的 Windows 防火墙规则。运行命令:
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
如果由于某种原因缺少此 RDP 防火墙规则,您可以使用 netsh 手动创建它:
netsh advfirewall firewall add rule name="allow RemoteDesktop" dir=in Protocol=TCP localport=3389 action=allow
或使用 Powershell:
New-NetFirewallRule -DisplayName 'Allow RemoteDesktop' -Profile @('Domain', 'Private') -Direction Inbound -Action Allow -Protocol TCP -LocalPort @('3389')
如果要限制允许连接到远程桌面的主机或子网,可以创建自定义规则,允许 Windows 防火墙仅接受来自特定 IP 地址、子网或 IP 范围的传入 RDP 连接。在这种情况下,您需要使用以下命令而不是上一个命令:
New-NetFirewallRule -DisplayName “Restrict_RDP_access" -Direction Inbound -Protocol TCP -LocalPort 3389 -RemoteAddress 192.168.1.0/24,192.168.2.100 -Action Allow
如果需要启用安全 RDP 身份验证(NLA – 网络级身份验证),请运行以下命令:
Set-ItemProperty -Path 'HKLM:SystemCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp' -name "UserAuthentication" -Value 1
现在您可以从您的计算机检查远程主机上 TCP 端口 3389 的可用性。运行命令:
Test-NetConnection 192.168.1.11 -CommonTCPPort rdp
应该有这样的结果:
ComputerName : 192.168.1.11
RemoteAddress : 192.168.1.11
RemotePort : 3389
InterfaceAlias : Ethernet0
SourceAddress : 192.168.1.90
TcpTestSucceeded : True
这意味着远程主机上的 RDP 已启用,您可以使用 mstsc.exe、RDCMan 或任何替代 RDP 客户端建立远程桌面连接。
暗示。如果需要同时在多台远程计算机上启用 RDP,可以使用以下 PowerShell 脚本:
$comps = “Server1”, “Server2”, “Server3”, “Server4” Invoke-Command –Computername $comps –ScriptBlock {Set-ItemProperty -Path "HKLM:SystemCurrentControlSetControlTerminal Server" -Name "fDenyTSConnections" –Value 0} Invoke-Command –Computername $comps –ScriptBlock {Enable-NetFirewallRule -DisplayGroup "Remote Desktop"}
默认情况下,只有本地管理员组的成员才能通过 RDP 进行远程连接。要允许非管理员用户进行 RDP 连接,只需将域用户添加到远程桌面组即可。
您可以使用本地用户和组 MMC 管理单元 (LUSRMGR.MSC) 将所需用户添加到本地远程桌面用户。
或者,您可以使用 Enter-PSSession 远程更改 RD 用户组成员身份。使用以下命令将域用户ASmith添加到本地组中:
net localgroup "remote desktop users" /add "contosoasmith”
或者,您可以使用另一个 PS Remoting 命令 Invoke-Command,而不是 Enter-PSSession cmdlet:
Invoke-Command -Scriptblock {net localgroup "remote desktop users" /add "contosoasmith”} -Computer Server1.contoso.com
如何使用PowerShell检查远程计算机上是否启用了远程桌面?
考虑一个 PowerShell 脚本,它允许您远程获取网络中多台计算机上的 RDP 状态。设置一个变量,其中包含要检查远程桌面是否已启用的远程计算机列表:
$comps=’wks101’,’wks102’,’wks112’, ‘wks223’
您还可以检查 Active Directory 域中的所有计算机上是否启用了 RDP。要获取 AD 中活动计算机的列表,您可以使用 PowerShell Active Directory 模块中的 Get-ADComputer cmdlet:
$comps = (Get-ADComputer -Filter 'operatingsystem -like "*Windows 10*" -and enabled -eq "true"').Name
现在您需要获取列表中远程计算机上的 fDenyTSConnections 注册表参数的状态。
$Report = @()
$comps ='localhost','localhost'
foreach ($comp in $comps) {
$RDPRegistry = Invoke-Command $comp -ScriptBlock { (Get-ItemProperty 'HKLM:SYSTEMCurrentControlSetControlTerminal Server').fDenyTSConnections } -ErrorAction SilentlyContinue
$RDPState = switch ($RDPRegistry)
{
'0' {"Enabled"}
'1' {"Disabled"}
Default {"n/a"}
}
$objReport = [PSCustomObject]@{
ComputerName = $comp
RDPState = $RDPState
}
$Report = $objReport
}
$Report
因此,您将获得一份很酷的报告,显示网络上的哪些计算机启用了远程桌面。