masahirorの気まま記録簿

個人的な出来事や意見、生活などの記録を思うままにブログに記録

VBSを毎回「管理者として実行」する方法

WindowsVista以降、セットアップや重要なプログラムを実行する際には「管理者として実行」というモードで開く必要があり、これを選択するとUACの確認画面が出るようになった。
仕事でよくVBSのスクリプトを書くのだが、その処理中でレジストリの「HKEY_LOCAL_MACHINE」に書き込みを行ったり、Windowsフォルダにデータを書き込んだりする場合は、いくらユーザにAdmin権限があったとしても、書き込みに失敗してしまう。
そのため、こういう処理を行うプログラムの場合は、一般的に実行プログラムを右クリックして「管理者として実行」を選択すれば良いのだが、VBSの場合、右クリックしてもこのメニューが表示されない。
そのようなVBSを実行させたい場合、手っ取り早い回避策として

  • BATファイルを作成
  • BATファイル内にVBSの実行パスを記載
  • BATファイルを右クリックして「管理者として実行」を選択

としていたが、これではファイルが余計にできてしまうし、単純なダブルクリックでは「管理者として実行」にならないので面倒くさい。


そこで、これを回避すべく、VBSを普通に開くだけで必ず「管理者として実行」になるよう改良してみた。



ネットで公開されていたソースを元に、使い勝手がいいよう自分なりにアレンジ。

Function runasCheck()
  Dim strScriptPathName

  Dim flgRunasMode
  Dim objWMI, osInfo, flag, objShell, os
  Dim strArgs
  Dim args
  
  Set args = WScript.Arguments

  flgRunasMode = False
  strArgs = ""
  
  ' フラグの取得
  If args.Count > 0 Then
    If UCase(args.item(0)) = "/RUNAS" Then
      flgRunasMode = True
    End If
    strArgs = strArgs & " " & args.item(0)
  End If


  Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
  Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
  flag = false
  For Each os in osInfo
    If Left(os.Version, 3) >= 6.0 Then
      flag = True
    End If
  Next

  Set objShell = CreateObject("Shell.Application")
  If flgRunasMode = False Then
    If flag = True Then
      objShell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """" & " /RUNAS " & strArgs, _
          "", "runas", 1
      Wscript.Quit
    End If
  End If
End Function


これを呪文のように、単純にコピペでVBSに記載。
そして、管理者として実行したいVBSのソース冒頭に、

Call runasCheck()

と記載するだけで、実行管理者権限で実行しなおしてくれる。


[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)