C#でPowershellを実行してみる

C#

Hyper-VをAPIで管理することを目標にしながら、やっていこうかなと思います。

.NETでHyper-Vを管理する手法はどうやら二つあるようです。

  • Hyper-V WMI Provider
  • Powershellを実行する(system.management.automation)

今回は簡単そうなPowershellを実行する手法を試してみたメモです。
VBもC#もあんま知らないですが、C#のほうが役に立ちそうなのでC#でやります

C#でPowershellを呼び出す

PowershellはWindows上で実行するスクリプトとして最強なので正直この手法が楽だと思います

Get-VMなどの標準のコマンドレットや自作コマンドレットも実行できるので、C#でPowershellを実行するところは簡単にしておき、難しい処理はPowershellを作りこめばいいだけです。
Hyper-V WMI Providerの資料が全然ないのもこの方法で十分だからかもしれませんね。。。

とりあえずやってみましょう

参考にしたのはこちらのページ
developers.gmo.jp
このページの下部にあるサンプルコードをダウンロードしてVisual Studioで開きます

開いたらProgram.csの中身を見てみましょう
(.net frameworkが古いと言われるかもですが、推奨って書いてるやつ選択してください)
構造は

MainーーRunPowerShell
|
|ーRemotePowerShell
|
|ーRemotePipeline

的な感じになっており、Powershellを実行できるメソッドが三つあるようです。
33~35行目のコメントアウトを一つ外すことで三つのうちどれかを試せます。
(コメントアウト外すの忘れて時間無駄にしたので気を付けてください)

参考記事が最強すぎてこれ読むだけでも良いのですが
一つ一つのメソッドを一応簡単にかみ砕いてみました

RunPowershell

Mainで始めにアカウントやパスワード、実行するコマンドを入れておきます。
それで認証やinvoke-comanndなどにまとめて送信してくれるというものです。
Invoke-commandを使うのでWinRM接続設定をしておく必要があります

実行時にアクセスが拒否されました的なエラーが出たらTrustedHostsの設定が上手くいっていないかもしれません

strCmdの最初のTrustedHostsの部分をコメントアウトしましょう。
Powershellにて別でTrustedHostsの処理を実行しておきましょう

Set-Item WSMan:\localhost\Client\TrustedHosts -Value 実行元のIP -Force -ErrorAction Stop
RemotePowershell

Invoke-commandではなく、WinRMのURLを利用したコマンド送信方法です。
WinRMの接続設定とファイアウォールを開く必要があります。

RemotePipeline

RemotePowershellではStrGet-VM | Out-stringというパイプラインを事前に設定していましたが、
RemotePipelineはGet-VMだけで、あとはobjpipelineでOut-stringを埋め込んでいる手法です

絶対このパイプラインを使うっていうときに使えるかもしれません。

実行結果


こんな感じで成功しました
設定をしっかりしていれば三つどの手法でもこんな感じで出来ると思います。

今はdebug.writelineで出力してますが、これをファイルに書き込みしたりもできますね

この機能がHyper-V APIの核となります。
例えばVMを作る機能なら、
VMを作るコマンドレットを作成しておいて、それをこのRunPowershellで送信する的な感じで作っておけば
APIとして作れそうです。
次はAPIの作成について書いていきたいと思います

タイトルとURLをコピーしました