Azure上の仮想マシンにPowerShellでリモートコマンドを実行する

PowerShellはリモートコンピュータ上でコマンドを実行できる機能があります。
PowerShell 2.0の新機能(2) ――リモート処理編 (1/4):CodeZine


Azure上に仮想マシンを構築して、そこに自動化処理を組み込む場合などは、この機能を使えると便利です。
コマンドを発行するサーバとAzure上の仮想マシンが同一ドメインに入っていればKerberos認証で比較的簡単にリモートコマンドが実行できるのですが、Azureでアドホック仮想マシンを作りたい場合などはそうも言ってられません。

Azure上の仮想マシンにリモートコマンドを発行するの方法を調べたので書いておきます。

$userName = "ユーザ名"
$password = "パスワード"

#パスワードをSecureStringに変換
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force

#認証情報の生成
$credential = New-Object System.Management.Automation.PSCredential($userName,$secPassword)

#WinRMのUri情報をAzureのコマンドレットから取得します。ポート番号もここで自動的に取得できます含まれます。
#サービス名と仮想マシン名はGet-AzureVMコマンドで確認できます。
$winRmUri = Get-AzureWinRMUri -ServiceName [サービス名] -Name [仮想マシン名]


#リモートセッションを張ります
Enter-PSSession -ConnectionUri $winRmUri -Credential $credential

 
 

証明書がオレオレ証明書の場合などは以下のエラーが出る場合があります。

Enter-PSSession : リモート サーバー xxxx.cloudapp.net への接続に失敗し、次のエラー メッセージが返されました: 宛先のコ
ンピューター (xxxx.cloudapp.net:5986) のサーバー証明書に次のエラーがあります:
SSL 証明書が不明の証明機関によって署名されています。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参
照してください。


これを回避するためには、セッションを張るコマンドに証明機関のチェックをしないオプション(SkipCACheck)を付けます。

Enter-PSSession -ConnectionUri $winRmUri -Credential $credential -SessionOption (New-PSSessionOption -SkipCACheck)

 
 
 

設定によってはCNの名前でもエラーが出る場合があります。

SSL 証明書にホスト名と一致しない共通名 (CN) が含まれています。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。

これを回避するためには、「SkipCNCheck」オプションを利用します。

Enter-PSSession -ConnectionUri $winRmUri -Credential $credential -SessionOption (New-PSSessionOption -SkipCNCheck)


これでAzure上の仮想マシンPowerShellコマンドを発行できるようになります。
もちろん、大前提のEnable-PSRemotingの実行や、Azure上のPowerShellのエンドポイントの有効化は必要です。