常规情况下,要远程桌面连接一台主机,只需要主机名、用户名、密码即可。但是Windows Azure 提供的域名(host.cloudapp.net)只能解析到网关,不能指向一台具体的机器,因此直接通过远程桌面无法识别。但是为什么在Windows Azure Portal上面却可以下载RDP文件进行远程连接,秘密就这RDP文件中。
下面是RDP模板:
full address:s:Demo.Cloudapp.Net
username:s:MosserLee
LoadBalanceInfo:s:Cookie: mstshash=RoleName#InstanceName
所以一旦我们清楚Azure主机的域名,用户名,密码,和主机所在的Role还有Instance,就可以根据模板自动生成RDP文件,通过远程桌面连接到Azure机器上(当然前提是Azure主机的设置中开放了远程桌面,并且允许从您你所在的区域进行访问)。
诸如简单字符串替换的琐事,可以交给PowerShell 去完成。下面的脚本: Connect-AzureHost.ps1,会根据用户传递的参数,在当前目录自动生成RDP文件,并调用mstsc.exe 自动连接远程桌面。脚本使用举例:
#连接ManagementServer ./Connect-AzureHost.ps1 -DnsName my.cloudapp.net -UserName pstips -ManagementServer #连接Agent ./Connect-AzureHost.ps1 -DnsName my.cloudapp.net -UserName pstips -Agent #连接自定义角色和实例Azure主机 ./Connect-AzureHost.ps1 -DnsName my.cloudapp.net -UserName pstips -RoleName MyWebRole -InstanceName instance1
源脚本Connect-AzureHost.ps1:
param ( [Parameter(Mandatory=$true)][string]$DnsName, [Parameter(Mandatory=$true)][string]$UserName, [string]$RoleName=$null, [string]$InstanceName=$null, [switch]$ManagementServer, [switch]$Agent ) # DRP file template $baseRDPTemplate = "full address:s:{0} username:s:{1} LoadBalanceInfo:s:Cookie: mstshash={2}#{3}"; #DRP file content. $RDPFileContent="" if(($ManagementServer -and $Agent)) { Write-Error "Parameter [ManagementServer] and [Agent] only can specify one."; return; } elseif($ManagementServer)#Handle Management server { $RDPFileContent = $baseRDPTemplate -f $DnsName,$UserName,"OMServer","OMServer_IN_0" } elseif($Agent)#Handle Agent { $RDPFileContent = $baseRDPTemplate -f $DnsName,$UserName,"AgentVMRole","AgentVMRole_IN_0" } elseif([string]::IsNullOrEmpty($RoleName )) #Role name can't empty { Write-Error "Parameter [RoleName] can not null"; return; } elseif([string]::IsNullOrEmpty($InstanceName))#Instance Name can't empty { Write-Error "Parameter [InstanceName] can not null."; return; } else { $RDPFileContent = $baseRDPTemplate -f $DnsName,$UserName,$RoleName,$InstanceName } #Generate RDP file $RDPFileName = "$($DnsName).RDP" $RDPFileContent | Out-File $RDPFileName #Remote Connect App $RDPApp="$($env:windir)\system32\mstsc.exe" #Save credential #Start-Process -FilePath "cmdkey" -ArgumentList "/add:$($DnsName) /user:$($UserName) /pass:$($Password)" #Launch RDP App Start-Process -FilePath $RDPApp -ArgumentList $RDPFileName #From https://www.pstips.net
扩展:如何自动输入密码?这里给出两种解决方案。
- CmdKey
可以通过CmdKey,在远程桌面连接之前先保存用户凭据,这样如果验证通过,用户就不用再输入密码。 - RDP 文件保存密码
RDP文件本身支持将密码以加密的二进制字符串保存在RDP文件中,因为时间原因,我没有测试成功,大家如若测试验成功,恳请留言赐教!
本文链接: https://www.pstips.net/powershell-custom-rdpfile-to-conect-azure-host-by-remote-desktop.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!