WMI でリモートコンピュータへアクセス - WMI Step
Topics
前回のステップで紹介したサンプルを改良して今度はリモートコンピュータに対してWMIを使ってメモ帳をリモート実行させ起動してみたいと思います。
以下のサンプルコードを入力してください。
Sample Code
Private Sub Command1_Click()
Dim Prc As SWbemObject
Dim Locator As SWbemLocator
Dim Service As Object
Dim Ret As Long
Dim PID As Long
Dim MesStr As String
Set Locator = New WbemScripting.SWbemLocator
Set Service = Locator.ConnectServer("LONDON", , "administrator", "password")
Set Prc = Service.Get("Win32_Process")
Ret = Prc.Create("notepad.exe", Null, Null, PID)
MsgBox "メモ帳を起動しました。" & vbCrLf & _
"PIDは、" & CStr(PID) & "ですよ。"
Set Prc = Nothing
Set Service = Nothing
Set Locator = Nothing
End Sub
Comment
実行する条件としてここではリモート上のコンピュータ名は「LONDON」で、「administrator」アカウントのパスワードは「password」とします。今回ポイントになる部分は、
Set Service = Locator.ConnectServer("LONDON", , "administrator", "password")
です。
以前も説明しましたが ConnectServer メソッドにはいくつかの引数があります。ConnectServer メソッドを使用する際に全ての項目を省略すれば自分自身に対してログオンしているアカウント情報を使用し自分自身に接続が行われます。今回のサンプルのように実行した場合は「LONDON」コンピュータに対して「administrator」アカウント「password」パスワードを使用して接続を行うということになります。
実行した結果「LONDON」コンピュータ上でリモート実行させ起動したメモ帳の PID が帰ってくるはずです。実際リモートコンピュータ上でタスクマネージャを起動して PID を確認してみましょう。
この様にWMIを使えばリモートコンピュータ上の管理も色々出来るわけです。今回はメモ帳を実行したわけですが別に他のクラスを使用して値の取得をすることも出来ますし違うメソッドを実行することも可能です。
ちなみにコンピュータ名を指定する際にローカルコンピュータ名を指定して、別アカウントを使って WMI に ConnectServer しようとしてもアクセス拒否エラーになって接続に失敗します。
ローカルコンピュータへ接続する際にはコンピュータ名やユーザー名・パスワードを指定するのを辞め、実際に使用するユーザー名でログインした上で ConnectServer して下さい。
リモートコンピュータへの WMI 接続は DCOM を使用して接続を行っているようです。よって WMI が使用する TCP ポートは MS-RPC (ポート TCP 135) になります。
ポートフィルタリングやファイアーウォールを構成しているネットワークやクライアントに於いてはこのポートを開放する必要がある点を頭に入れておくとトラブルシューティングの際に役立つかもしれません。
(注意 2002/09/29)
Windows XP 以降 (.Net Server や Windows 2000 SP2 など) ではリモートでプロセスを作成しても実行画面は表示されない仕様に変わってしまったようです。プロセス自身は問題なく作成されるわけなのでセキュリティの向上という名目でしょうがデスクトップと対話的にやり取りが出来ない仕様になったようですね。
次は「WMI でプロパティ値の書き込みをしてみよう」です。