コードから管理者権限でスクリプトを実行する
VistaではUACが有効だと何でもかんでも止められてしまう。
そういえばバッチファイルやWSHでサービスとかレジストリとかいじるのはどうなるのか、と思ったら案の定アクセス拒否される。
管理者コマンドプロンプトを自分で開くと言う手はあるが、面倒。プログラムなりコマンドなりで昇格できないのか……と思ったが、簡単な手はないようだ。
- http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx
- http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx
- http://ebi.dyndns.biz/diary/20080813.html
一応最後のblog記事にサンプルがある。Vistaの場合は昇格状態でスクリプトを起動し直す、という流れのようだ。
というわけでJScript大好きな私もちょっと書いてみた。こちらはVistaで動かすのが前提なので手抜き。
実行すると指定のサービスのon/offを行う。ポイントは2点。
- ShellExecute関数の第4引数は動詞(verb)なのだが、これにrunasを指定するとUACが起動する。しかしMSDNには記述がない。
- 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("サービス状態が不明です"); }
サービス上げ下げの処理はこちらを参考にした。