制限付きユーザーから管理者のユーザー権限でプログラムを実行する

Windowsに制限付きユーザーでログインしている時に管理者のユーザー権限でプログラムを実行したい場合、コンテキストメニューから「別のユーザーとして実行(A)…」を選択するか、runasコマンドを使う。

runasコマンドの基本的な使い方は、以下の通り。

runas /user:ユーザー名 プログラム

詳しい使い方はrunas /?に譲るとして、大抵の場合、管理者のユーザー権限でプログラムを実行したい場合は、ユーザーのパスワードの入力が必要となる。

JScriptを使って管理者のユーザー権限でプログラムを実行し、パスワードを自動的に入力したい場合は、以下のようなスクリプトになる。

var userFile = "user.txt";
var passFile = "pass.txt";
var args = WScript.Arguments;

if (args.length != 1) {
    WScript.Quit(1);
}

var AppPath		= args(0);
var AppExecUserName	= getTextFileData(userFile);
var AppExecUserPass	= getTextFileData(passFile);

//実行したいプログラムを指定する。
//runasコマンドのコマンドラインオプションは、"runas /?"を参照
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("runas /user:" + AppExecUserName + " " + AppPath + " ", 2);
//savecred
delayedSendKeys(AppExecUserPass);

//実行するパスワードを送信
function delayedSendKeys(str) {
    WScript.Sleep(300);
    for (var i = 0; i < str.length; i++) {
        WScript.Sleep(100);
        WshShell.SendKeys(str.substring(i, i + 1));
    }
    WScript.Sleep(300);
    WshShell.SendKeys("{enter}");
}

function getTextFileData(fileName) {
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var s = fso.OpenTextFile(fileName, 1, false).ReadAll();
    return s;
}

パスワードの自動入力は、SendKeysで行なっている。

このスクリプトを使うと、管理者のユーザー権限とパスワードが設定済みならば、制限付きユーザーであってもほぼ何でも実行できてしまうようになるので、スクリプトの取り扱い(特に利用環境)とパスワードの漏洩には十分に注意しましょう。使用する場合は、自己責任で。

このJScriptを一歩進めてExcelVBAで実装してみると、以下のような感じになった。

パスワードの管理がほんの少しだけましになるけれど、やっぱり取り扱いには十分な注意が必要。