VBAその他

Last-modified: 2006-10-09 (月) 22:22:16
 

XPのrunasコマンドをVBAで使用する

XPには現在ログオン中のユーザーをログオフさせずに、一時的に違うユーザーでプログラムを実行できるrunasというコマンドがある。このコマンドをVBAで使ってみた。
今回はWshShell.Runメソッドを利用してrunasコマンドを起動、管理者権限のあるユーザーIDでログオンし、外部コマンドを実行するというもの。

Set objShell = CreateObject("WScript.Shell")
'runasで実行したいプログラムを設定("の数に注意)
strCommand = """cmd /c C:\progra~1\xxxx\xxx.exe xxxxxx"""
'runasと外部コマンドの設定
strRunas = "runas /user:domain\admin_id" & " " & strCommand
'runasの実行と実行結果の変数への代入
iReturn = objShell.Run(strRunas, 1, True)
'実行結果が1の時はrunasコマンド自体が失敗なのでメッセージを出力し終了
If iReturn = 1 Then
MsgBox "Runas Login Failed."
Set objShell = Nothing
Exit Sub
End If
Set objShell = Nothing

strCommandに設定する文字列は実行したいプログラムに依存するので、プログラムに合わせて変更が必要。
このコードはWshShellのRunメソッドを使ってrunasを起動しているだけなので、コードの実行時にパスワードを入力する必要がある。

Runasの機能をスクリプト内で使う

「XPのrunasコマンドをVBAで使用する」でrunasをVBAで使う方法を紹介したが、これはWshShellのRunメソッドを使ってRunasを起動しているだけなので、コードの実行時にパスワードを入力する必要がある。そういう方法ではなく、以前のWindowsのリソースキットにあったsu.exeのように、スクリプト内にパスワードを埋め込んだりリダイレクトしたりして、違うユーザーとしてプログラムを実行したいことがあると思う。
runasを使ってそれを実現しようとするとかなり大変なので、今回はrunas代わりに使えるフリーのツールをいくつか紹介する。
どのツールもexeファイル単体で使えるので、ファイルを共有のネットワークドライブに置いておけば、どのPCからでもスクリプトが実行できる。

CPAU

cpau -u domain\user -p password -ex cmd

上記は一番シンプルなサンプルコマンド。-u -p -ex以外にもスイッチ(オプション)があり、例えば-pipepwdを使えばSTDINからパスワードを読み取らせることができる。
標準ではユーザーのプロファイルを読み込まないので、runasの標準設定のようにプロファイルを読み込む設定で使いたい場合は-profileを指定する。
詳しくはCPAUのサイトをどうぞ。

LSrunas

一番シンプルでも5つのスイッチが必要。

lsrunas /user:administrator /password:Mypassword /domain:Mydomain /command:notepad.exe /runpath:c:\

個人的には、lsrunasよりはCPAUの方が使い勝手が良いと思う。
詳しくはlsrunasのサイトをどうぞ。

LSrunasE

lsrunasにはLSrunasEというパスワードを暗号化できるバージョンがある。パスワードを暗号化するためのツールはダウンロードしたZipファイルに含まれている。コマンドラインはlsrunasと同じで、

lsrunase /user:administrator /password:xxxxxxxx /domain:Mydomain /command:notepad.exe /runpath:c:\

となる。ただし、パスワード部分のxxxxxxxxはツールを使って暗号化したものを使う。
詳しくはlsrunaseのサイトをどうぞ。