常规情况下,要远程桌面连接一台主机,只需要主机名、用户名、密码即可。但是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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
