読者です 読者をやめる 読者になる 読者になる

ほげほげー

C#メインで困ったことや面白く感じたことをメモしていきます。

Azureの仮想マシンへリモートでコマンドを投げる

Azureの仮想マシンでPSRemotingによる接続をする場合、SSLでの接続が必要なので証明書のインストールが必要です。
SSLでの接続はムッシュせんせーが書いて下さってたのでご参照くだされー。

Azure 仮想マシンに 5985 を使用して PowerShell で接続 | SE の雑記

久々に触ると手順を毎回忘れるので覚書。

仮想マシンを作成する

# Add-AzureAccount
Select-AzureSubscription -SubscriptionName $subscriptinName
Set-AzureSubscription -SubscriptionName $subscriptinName -CurrentStorageAccountName $storageAccountName

$imageName = (Get-AzureVMImage| `
    where Label -Like "*Windows Server 2012 R2 Datacenter*" | `
    sort PublishedDate -Descending | `
    select -First 1).ImageName

New-AzureVMConfig -Name $vmName -InstanceSize Small -ImageName $imageName | `
    Add-AzureProvisioningConfig -Windows -AdminUsername $userName -Password $password | `
    New-AzureVM -Location "Japan West" -WaitForBoot -ServiceName $serviceName

証明書をインストールする

念のため2種類の手順を書いておく。

その1:ブラウザ経由

Chromeでのやり方。
ChromePowerShellのポートを指定して開く。

f:id:tyhe:20141015010945p:plain

鍵マークをクリックして証明書の詳細を表示する。

f:id:tyhe:20141015012041p:plain

詳細タブでファイルにコピーボタンをクリックする。

f:id:tyhe:20141015013103p:plain

証明書のエクスポートウィザードが立ち上がるので「次へ」を連打。
保存するパスを指定して次へ。そして完了。

C:\Users\user\Desktop\hoge.cer

保存したcerファイルをダブルクリック → 証明書のインストール
現在のユーザーかローカルコンピュータ好きな方を選択。
証明書をすべて次のストアに配置するを選択して「信頼されたルート証明書」を選択。
インストール完了。

これでEnter-PSSession とかが使えるように。 -UseSSL オプションを忘れずに。

その2:PowerShell

$WinRMCertificateThumbprint = (Get-AzureVM -ServiceName $vmName -Name $vmName | Select-Object -ExpandProperty VM).DefaultWinRMCertificateThumbprint
(Get-AzureCertificate -ServiceName $vmName -Thumbprint $WinRMCertificateThumbprint -ThumbprintAlgorithm SHA1).Data | Out-File "${env:TEMP}\CloudService.tmp"
 
$X509Object = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 "$env:TEMP\CloudService.tmp"
$X509Store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
$X509Store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$X509Store.Add($X509Object)
$X509Store.Close()

Remove-Item "$env:TEMP\CloudService.tmp"

おまけ:もろもろ有効にする

Windows Server 2012 R2より前のものを使う場合はいろいろ有効化しないといけないです。
が、色々と罠があったりして面倒なのでぎたぱそせんせーのValentiaを使いましょふ。
まだvalentiaをインストールしていない方は以下をおもむろに

# @Visual Studioのパッケージ マネージャー コンソール
Install-Package valentia

もしくは

# @コマンドプロンプト OR PowerShellコンソール OR PowerShell ISE
powershell -NoProfile -ExecutionPolicy unrestricted -Command 'iex ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String((irm "https://api.github.com/repos/guitarrapc/valentia/contents/valentia/Tools/RemoteInstall.ps1").Content))).Remove(0,1)'

を入力してEnterキーを軽快に叩きましょう。

ここでエラーが発生する場合はPowerShellへの信仰心が足りません。精進しましょう。
おそらく引数が空の文字列であるため、パラメーター 'Path' にバインドできません。的なエラーが出ているのではないでしょうか。
PowerShellの仕様なのかなんなのか、なぜか$env:PSModulePathにマイドキュメントへのパスが載らないことがあるようです。
おとなしくマイドキュメントへのパスを環境変数に追加しましょう。

$path = [System.Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
$path += ";$([System.Environment]::GetFolderPath("MyDocument"))\"
[System.Environment]::SetEnvironmentVariable("PSModulePath", "Machine")

PowerShellコンソール(OR ISE)を立ち上げて、モジュールを読み込みましょう。

Import-Module valentia

ここまで終わったら後は以下のコマンドレットを叩くだけ。*1

Initialize-ValentiaEnvironment -NoOSUser -NoPassSave -NoReboot

色々と善きに計らってくれます。OSを日本語化してても大丈夫です。
ぎたぱそせんせー is GOD

Initialize-ValentiaEnvironmentに失敗したらvalentia.ps1の中身を修正して対応しませう。

Valentiaは少しづつ触っているけど、ちゃんと機能を使えたらとても便利そう。

*1:Valentiaの機能をフル活用する時はNoOSUserとかを必要に応じて外すこと