【题外话】
某天不小心点了XX管家的自动修复,虽然及时点了取消也看到了远程桌面服务成功被关闭,但是忙完该干的事以后竟然忘记了这件事,在断开远程桌面服务之前也忘记再次打开。以至于之后几天一直以为Azure出现了问题,直到某天突然想起来是自己忘重新打开远程桌面的问题。还好XX管家没有把Powershell禁掉,我们还可以使用Powershell再次启用远程桌面服务。
【文章索引】
再次使用XX管家将远程桌面禁用,发现实际上是这样的:
可见其并没有停止或者禁用Remote Desktop Services(TermService),而仅仅是将远程桌面的设置改为了“不允许连接到这台计算机”,并且也没有对防火墙配置进行修改。
Powershell Remoting Protocol协议是基于HTTP或HTTPS协议的,其端口分别为5985(HTTP)和5986(HTTPS),对于后者与平时的HTTPS一样,都是使用SSL证书进行传输加密的。对于Azure默认的虚拟机,已经配置好了HTTPS协议的Powershell,可以直接使用5986端口进行通信。
Powershell连接远程主机的命令是“Enter-PSSession”,可以参考这里。而对于连接Azure,我们使用SSL证书+用户名即可连接,命令如下:
Enter-PSSession -ComputerName 域名或IP地址 -Port 5986 -Credential 用户名 -UseSSL
如果我们现在直接输入命令的话,将会提示下列信息:
所以我们需要获取服务上的证书,然后存到信任的证书颁发机构中。
对于IE浏览器,首先需要在“Internet选项”的“高级”中关闭“显示友好 HTTP 错误信息”,然后访问“https://域名:5986”,在确认了继续访问网站后,点击“证书错误”,然后选择“查看证书”,接下来可以在“常规”选项卡中选择“安装证书”或在“详细信息”选项卡中选择“复制到文件”。
对于Chrome浏览器(不论Windows下的还是Linux下的),可以点击网址前边的图标,在“Connection”下点击“Certificate Information”,如果在Windows下操作的话,出现的对话框与IE的相同,如果在Linux下操作,请选择“Export”,然后可以设置文件的扩展名为“.cer”。
如果上述步骤直接点击了“安装”证书,将会出现“证书导入向导”;如果选择的是保存.cer文件,那么双击打开.cer文件,选择“安装证书”也会出现“证书导入向导”。在向导中可以选择将证书为当前用户保存也可以为当前计算机保存,然后选择“将所有的证书都放入下列存储”,然后选择“受信任的根证书颁发机构”,就可以了。
接下来再输入上述的命令提示符会变为如下的形式说明登陆成功:
[xxxxxxxx.cloudapp.net]: PS C:\Users\用户名\Documents>
对于管理Windows,可以使用WMI来实现,Powershell也提供了操作WMI的命令。
比如我们获取Remote Desktop Services(TermService)服务的状态,可以使用如下的命令:
Get-WMIObject -query "select * from win32_service where name=‘TermService‘" | out-string
而如果远程桌面服务是正在运行的,我们则可以使用获取远程桌面服务的运行状态,关于Win32_TerminalServiceSetting这个WMI类可以参考这里,当然如果操作系统是2K3或以下版本的话Namespace就应该改为ROOT\CIMV2:
Get-WMIObject Win32_TerminalServiceSetting -Namespace ROOT\CIMV2\TerminalServices
比如如果远程桌面设置为“不允许连接到这台计算机”,那么如下的“AllowTSConnections”就会为0。
Win32_TerminalServiceSetting有个方法是SetAllowTSConnections,其方法原型如下:
uint32 SetAllowTSConnections( [in] uint32 AllowTSConnections, [in] uint32 ModifyFirewallException );
可以看到其可接受两个参数,分别是是否启用远程桌面连接以及是否修改防火墙例外设置。例如我们仅修改允许连接远程桌面,则可以使用如下的命令:
(Get-WMIObject Win32_TerminalServiceSetting -Namespace ROOT\CIMV2\TerminalServices).SetAllowTSConnections(1)
除了将远程桌面的设置改为了“不允许连接到这台计算机”外,还可能出现没有开启远程桌面服务或者在防火墙配置中禁用了远程桌面端口。
如果获取发现远程桌面服务没有打开,那么我们是没法在Powershell中通过WMI对远程桌面进行设置的(获取、设置都不可,表现为命令一直卡住无法继续),所以我们需要开启远程桌面服务:
如果Remote Desktop Services被禁用,我们可以使用Set-Service命令首先需要将其修改为手动启动(默认值):
Set-Service -Name TermService -StartupType Manual
然后使用Start-Service启动该服务(当然net start也是可以的):
Start-Service -Name TermService
此外,开启防火墙中远程桌面端口除了使用WMI外,也可以使用netsh命令,我们可以使用如下命令获取防火墙的规则,当然规则名称在不同操作系统下还是有出入的,这里的是Windows Server 2008 R2中文版的规则名称:
netsh advfirewall firewall show rule name="远程桌面(TCP-In)"
然后也可以使用如下的命令启用这些规则,这里的操作系统同上,如果是英文操作系统的话就应该替换为“remote desktop”:
netsh advfirewall firewall set rule group="远程桌面" new enable=Yes
不过这种方式相对还是复杂很多,就不如使用WMI操作更简单些了。
【相关链接】
-
CSI: Re-enabling Remote Desktop with PowerShell after
you‘ve blocked it with your own firewall rule:http://www.hanselman.com/blog/CSIReenablingRemoteDesktopWithPowerShellAfterYouveBlockedItWithYourOwnFirewallRule.aspx
- Relationship to Other Protocols:http://msdn.microsoft.com/en-us/library/dd305175.aspx
- Enter-PSSession:http://msdn.microsoft.com/en-us/library/hh849707
- PowerShell探秘(4)WMI对象:远程桌面开关:http://blog.csdn.net/zooen2011/article/details/12960989
- Win32_TerminalServiceSetting class:http://msdn.microsoft.com/zh-cn/library/aa383640