PowerShell 自定义RDP文件通过远程桌面连接Azure主机


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

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注