2012年5月8日火曜日

WinRM をプログラムから利用する

最近は転職のために色々あってすっかりご無沙汰ですが、少しずつ落ち着いてきたのでこちらもちょっとずつですがペースをあげていきます。今回は WinRM を .NET 言語から利用する、というのをやってみました。WinRM は非常に便利かつお手軽に WMI を利用できる手段なのですが、それもスクリプトからの話で、プログラムコードから利用するには結構四苦八苦していました。

まず WinRM を利用するための下準備として、接続対象となるホストにて環境設定を行う必要があります。管理者権限にてコマンドプロンプト等を起動して、winrm qc を実行してくれれば終わりです。利用するポートなどを細かく設定したい場合は、quick config ではなくて、全て手作業にて行う必要があります。

環境設定を行いましたら実装ですが、やはり Visual Studio も管理者権限が必要です。

WinRM を利用するために参照設定を行います。対象となるライブラリは wsmAuto.dll で、System32 フォルダにあります。参照設定後に次のようなロジックを作成します。

   1: Dim wsAuto As New WSMan
   2: 'ホスト名を指定してセッション作成
   3: Dim wrmSession As IWSManSession = wsAuto.CreateSession(“HOSTNAME", 0, Nothing)
   4: 'ローカルへのセッション作成
   5: 'Dim wrmSession As IWSManSession = wsAuto.CreateSession(Nothing, 0, Nothing)
   6:  
   7: 'WQL を実行して値を列挙
   8: Dim resURI = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*"
   9: Dim dialect = "http://schemas.microsoft.com/wbem/wsman/1/WQL"
  10: Dim wql = "SELECT * FROM Win32_Service WHERE Name='winrm'"
  11: Dim resProc As IWSManEnumerator = wrmSession.Enumerate(resURI, wql, dialect)
  12: Do While Not resProc.AtEndOfStream
  13:     Console.WriteLine(resProc.ReadItem)
  14: Loop

このような形で記述する事で、WinRM を利用した値の取得が行えます。WMI を直接利用する場合は動的ポートなどの問題が発生しますが、WinRM を利用する事で、外部に公開するポートは http/https で利用するポートのみで対応が可能です。

なお、ソースのコメントにもありますが、ローカル接続の場合はホスト名等を指定せずに CreateSession メソッドを呼び出すことで可能になります。

0 件のコメント:

コメントを投稿