ZESTではGoogle Cloud Platformに加え、一部Microsoft Azureも使用しています。
Azure環境ではWindows Virtual Machine(VM)を運用しているのですが、先日、Windows UpdateでRemote Desktopにアクセスできなくなる事象が発生しました。 その際に利用した、RDP接続できない場合でもVMにアクセスする方法についてご紹介します。
azコマンドからのPowerShellスクリプトの実行
VMエージェントがインストールされている場合*1、az コマンドからPowerShellのスクリプトをリモートで実行することができます。
# script1.ps Get-Item .
az vm run-command invoke --command-id RunPowerShellScript --name <VM name> -g <Resource Group> --scripts @script.ps1
上記の実行結果は下記のようになります。value[].message
に実行結果が格納されます。
{ "value": [ { "code": "ComponentStatus/StdOut/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": " Directory: C:\\Packages\\Plugins\\Microsoft.CPlat.Core.RunCommandWindows\\1.1.15\n\n\nMode LastWriteTime Length Name \n---- ------------- ------ ---- \nd----- 9/17/2023 7:24 AM Downloads \n\n", "time": null }, { "code": "ComponentStatus/StdErr/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "", "time": null } ] }
管理者以外でrun-commandを実行する場合には別途 Microsoft.Compute/virtualMachines/runCommands/write
の権限が必要になります。
コマンドの実行には、Microsoft.Compute/virtualMachines/runCommands/write アクセス許可が必要です。 仮想マシンの共同作成者ロール以上のレベルには、このアクセス許可があります。
正常に実行結果を取得する場合には、443ポートを許可が必要になるケースがあります。
正常に機能するには、実行コマンドに Azure のパブリック IP アドレスへの接続 (ポート 443) が必要です。 この拡張機能にこれらのエンドポイントへのアクセス権がない場合、スクリプトが正常に実行されても結果が返されないことがあります。
またAzure portalの 実行コマンド - RunPowerShellScript
メニューからも実行することができます。
Azure シリアルコンソール
Azure portalからシリアルコンソールに接続することができます。
事前準備として、Emergency Management Services(EMS)を有効化します。
Azure portalから 実行コマンド - Enable EMS
を実行します。*2
EMS有効後、メニューの シリアルコンソール
からコンソールにアクセスできます。
CMD #チャンネルを作成 ch -si 1 #チャンネルに接続
ログインプロンプトが表示されるので、Windowsログインに利用しているID/PASSを入力します。
ログイン後、コマンドプロントが起動します。
PowerShellも起動することができます。
またazコマンドからシリアルコンソールに接続することもできます。
az serial-console connect -n <VM name> -g <Resource Group>
まとめ
Windows サーバにRDP接続できない場合でも、上記の方法でVMにアクセスすることができます。 今回Windows UpdateでRDP接続できない事象が発生しましたが、コマンドやコンソールからRDP接続できない原因の調査、修復をすることができました。 またRDPを用いずにVMを操作できるため、上記のような調査以外にも、作業の自動化にも利用できると思います。