コードから管理者権限でスクリプトを実行する

VistaではUACが有効だと何でもかんでも止められてしまう。

そういえばバッチファイルやWSHでサービスとかレジストリとかいじるのはどうなるのか、と思ったら案の定アクセス拒否される。

管理者コマンドプロンプトを自分で開くと言う手はあるが、面倒。プログラムなりコマンドなりで昇格できないのか……と思ったが、簡単な手はないようだ。

一応最後のblog記事にサンプルがある。Vistaの場合は昇格状態でスクリプトを起動し直す、という流れのようだ。

というわけでJScript大好きな私もちょっと書いてみた。こちらはVistaで動かすのが前提なので手抜き。

実行すると指定のサービスのon/offを行う。ポイントは2点。

  1. ShellExecute関数の第4引数は動詞(verb)なのだが、これにrunasを指定するとUACが起動する。しかしMSDNには記述がない。
  2. ShellExecuteで余分な引数を追加し、その直後にQuitすることで2度目のスクリプト実行に処理を引き継ぐ。
if(WScript.Arguments.length == 0) {
	var sh = WScript.CreateObject("Shell.Application")
	sh.ShellExecute("wscript.exe", "\"" + WScript.ScriptFullName + "\"" + " uac", "", "runas", 1);
	WScript.Quit(0);
}

var ADS_SERVICE_STOPPED = 1;
var ADS_SERVICE_RUNNING = 4;

var computer = GetObject("WinNT://computerName, computer");
var service = computer.GetObject("Service", "serviceName");
if(service.Status == ADS_SERVICE_STOPPED){
	WScript.Echo("サービスを開始します");
	service.Start();
} else if (service.Status == ADS_SERVICE_RUNNING) {
	WScript.Echo("サービスを終了します");
	service.Stop();
} else {
	WScript.Echo("サービス状態が不明です");
}

サービス上げ下げの処理はこちらを参考にした。

http://support.microsoft.com/kb/247557/ja