🦔

PowerShell だけで (Azure CLI を使わずに) Bastion を Native Client で RDP する

2023/05/10に公開

PowerShell だけで (Azure CLI を使わずに) Bastion を Native Client で RDP する

ネイティブ クライアントと Azure Bastion を使用して仮想マシンに接続する - Azure Bastion では Native Client (mstsc.exe) を使って Bastion 経由で Remote Desktop する方法が書かれています。
しかし、これは Azure CLI を使っており、一部の環境ではもしかしたら PowerShell しか使えないかもしれません。
Windows でも Azure CLI は問題なく動くので実質問題はないのですが、せっかくなので PowerShell だけでもつなげないか、ということです。

以下の PowerShell cmdlet で PowerShell だけで Bastion 経由で RDP できます。

Function Connect-MyAzBastionRdp() {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)] [string] $VMName,
        [string] $VMResourceGroupName,
        [Parameter(Mandatory = $true)] [string] $ResourceGroupName,
        [Parameter(Mandatory = $true)] [string] $BastionName
    )

    if ([string]::IsNullOrEmpty($VMResourceGroupName)) {
        $VMResourceGroupName = $ResourceGroupName
    }

    @('Az.Accounts', 'Az.Network') | Import-Module
    $SubscriptionId = (Get-AzContext).Subscription.Id
    $VMResourceID = "/subscriptions/$SubscriptionId/resourceGroups/$VMResourceGroupName/providers/Microsoft.Compute/virtualMachines/$VMName"
    $BastionDnsName = (Get-AzBastion -ResourceGroupName $ResourceGroupName -Name $BastionName).DnsName

    $Params = @{
        Method  = 'GET'
        Uri     = "https://$BastionDnsName/api/rdpfile?resourceId=$VMResourceId&format=rdp"
        Headers = @{
            'Content-Type'  = 'application/json'
            'Authorization' = "Bearer $((Get-AzAccessToken).Token)"
        }
    }

    $RdpExclude = @('use multimon', 'signscope', 'signature')
    $RdpFile = (Invoke-RestMethod @Params).Split("`n") | Where-Object {
        if (-Not [string]::IsNullOrEmpty($_)) {
            ($Name, $Type, $Value) = $_.Split(':', 3, [System.StringSplitOptions]::TrimEntries)
            (-Not $RdpExclude.Contains($Name))
        }
    }

    $RdpFilePath = Join-Path $Env:TEMP "$VMName.rdp"
    @('screen mode id:i:1', 'desktopwidth:i:1920', 'desktopheight:i:1080', 'smart sizing:i:1', $RdpFile) | Out-File $RdpFilePath
    & 'mstsc.exe' $RdpFilePath
}

使い方はこんな感じです。

Connect-MyAzBastionRdp -VMName vm-ad01 -ResourceGroupName active-directory -BastionName bast-hub00

参考

  • マルチモニタをオフにして Bastion で RDP を使う
    実はこちらの記事は別の記事のタイトルを変えようと思って作成したものなので、経緯などについてはこちらを参照ください。

https://zenn.dev/skmkzyk/articles/bastion-without-multimon

  • Remote Desktop したときに、最大化してるんだけど Window は小さくしたい

https://zenn.dev/skmkzyk/articles/remote-desktop-smart-sizing

Microsoft (有志)

Discussion