Windows7~10で設定した特定のプログラムのみUAC回避させる方法(画像はWin7)

Last-modified: 2023-05-05 (金) 21:55:39

はじめに:@wikiからwikiwikiに緊急移設した際のデッドリンク、添付ファイルなどを修正しました。(2014/7/14)

制御(UAC)により、管理者権限昇格ダイアログが出るようになりました。
(正確には、client.exeは通常ユーザ権限、UO.exe、UOPach.exe、UOAssistは管理者権限で実行されるようになりました)

ってことで、クライアントに干渉するアプリケーションも管理者権限でないと、干渉できません。

権限不足で干渉できないと、UOAMなら自動追尾がうまく動かなくなるとか、
WinShotではPrintScreenキー単独でSSを撮れなくなる場合があるなどの問題が発生します。

注意:管理者権限に昇格するためには、一般ユーザではなく管理者ユーザでログインする必要があります。

でも管理者権限昇格ダイアログはうざいですよね。

だからってUACは切っちゃダメ!

EscapeOfUACNG1.jpg

こうして、

EscapeOfUACNG2.jpg

こうすれば簡単だけど、絶対ダメ!!

じゃぁ、どうすればいいのよ?ヽ(`Д´)ノウワァァァン!!

ごもっともです。

そこで!ですよ!!

じゃぁ対処しましょう。憎たらしいUACを回避!設定したプログラムだけでという安全策で!!

(あ、UACさん、あなたが悪いんじゃないんです。むしろいてくれて感謝してます)

最初だけ必要な手順は以下の1,2の2つ。
3だけ、UAC回避したいアプリケーション毎(プログラム毎)の数だけ必要。

1.共通ファイル[※1]を作成(ダウンロードすればおk!)

2.共通ファイルをWindows7のタスクマネージャに登録[※2]

3.UAC回避したいアプリケーション毎(プログラム毎)のファイル[※1]を作成

※1:Microsoftの提供しているVisual Basic Scripting(vbs)という、メモ帳で修正可能な実行スクリプトです。
※2:タスクマネージャを通すことで、「最上位の特権で実行可能」になるのです!

どうです?

これだけ書くと簡単そうでしょう?

では具体的にやって行きましょう。

1.共通ファイルを作成(ダウンロードすればおk!)

まず、共通ファイルであるUACEscape.vbsをDLしてください。

保存先はお好きなパスで構いませんが、後で指定する重要なファイルなので忘れないでください。
※なお、ダウンロード時、UAC回避.vbsというファイル名で保存して下さい。(wikiwkiが日本語パス未対応な為・・・すみません><)

私はD:\tools\に入れています。

ちなみに中実はこんな感じです。

EscapeOfUACCommon.jpg
 ''↓コピーするときはココをコピーしてください
 Option Explicit
 Dim objWshShell ' WshShell オブジェクト
 Dim objFileSystem
 Dim objFilePath
 Dim strParam
 Dim strExecParam
 If WScript.Arguments.Count <> 0 Then
     strParam = Split(WScript.Arguments(0), ",")
     strExecParam = ""
     If UBound(strParam) = 1 Then
         strExecParam = strParam(1)
     End if
     Set objWshShell = WScript.CreateObject("WScript.Shell")
     Set objFileSystem = CreateObject("Scripting.FileSystemObject")
     Set objFilePath = objFileSystem.GetFile(strParam(0))
     objWshShell.CurrentDirectory = objFileSystem.GetParentFolderName(objFilePath.ShortPath)
     Call objWshShell.Run("cmd.exe /c start /NORMAL " & objFilePath.ShortPath & " " & strExecParam,0,False)
 End if

2.共通ファイルをWindows7のタスクマネージャに登録

ちょっと面倒ですが、UAC回避.vbsの保存場所さえ間違えなければ簡単です。

2.1.タスクスケジューラの起動

スタートメニューの「ファイル名を指定して実行」をクリック(またはWindowsKey + Rを押下)

開いたダイアログに「taskschd.msc /s」と入力。

EscapeOfUAC1.jpg

で、「OK」ボタンを押下。

2.2.タスクの作成

こんなウィンドウが開いていると思いますので、「操作」→「タスクの作成」をクリック。

EscapeOfUAC2.jpg

「名前(M):」に「UACEscape」と入力し、「最上位の特権で実行する(I)」にチェック。

EscapeOfUAC3.jpg

2.3.タスクの操作(動作)を登録

ここも重要です。

「操作」タブをクリックし、「新規(N)」を押下。

EscapeOfUAC4.jpg

「新しい操作」ダイアログが開きますので、

「参照(R)」ボタンを押下し、「1.共通ファイルを作成(ダウンロードすればおk!)」で保存したUAC回避.vbsを選択。

「引数の追加(オプション)(A):」に「$(Arg0)」と入力。

入力内容をちゃんと確認し、「OK」ボタンを押下。

EscapeOfUAC5.jpg

2.4.確認していきます。

「タスクの作成」ダイアログで、「操作」タブに、

操作「プログラムの開始」
詳細「保存したUAC回避.vbsのフルパス+$(Arg0)」

となっていることを確認し、「OK」ボタンを押下。

EscapeOfUAC6.jpg

「タスクスケジューラ」ウィンドウの中央に、

「UACEscape」があることを確認し、タスクスケジューラを閉じてください(右上のXをクリック)

EscapeOfUAC7.jpg

3.UAC回避したいアプリケーション毎(プログラム毎)のファイルを作成

アプリケーション毎(プログラム毎)に以下のファイルを作成します。

アプリケーション毎(プログラム毎)に変更するところは、「ファイル名」、「アプリケーションのフルパス」です。

※アプリケーションのフルパスの調べ方は後述いたします

EscapeOfUACApplication.jpg
 ''↓コピーするときはココをコピーしてください
 Option Explicit
 Dim objTaskService
 Dim objFolder
 Dim objTask
 Dim strAppPath
 '' ===ここにプログラムのフルパスを設定===
 strAppPath = "C:\Program Files (x86)\UOAssist\UOAssist.exe"
 '' タスクサービスオブジェクトの取得
 Set objTaskService = CreateObject("Schedule.Service")
 '' タスクサービスとの接続
 objTaskService.Connect
 '' 場所を指定してフォルダオブジェクトの取得
 Set objFolder = objTaskService.GetFolder("\")
 '' タスク名を指定してタスクオブジェクトを取得
 Set objTask   = objFolder.GetTask("UACEscape")
 '' タスクを実行
 objTask.Run """" & strAppPath & """"

アプリケーションのフルパスを調べる方法

まず、スタートメニューをたどっていって、調べたいアプリケーションを右クリックし、プロパティをクリック。

CheckFullPath1.jpg

プロパティダイアログが表示されますので、反転している「リンク先(T)」がアプリケーションのフルパスです。

CheckFullPath2.jpg

アプリケーションにパラメータを渡したい場合

たとえばメモ帳にパラメータを渡したい場合

こんなかんじで、実行ファイルの直後(パラメータの先頭)にカンマ「,」を入れてください。

 strAppPath = "%windir%\system32\notepad.exe,c:\test.txt"

以上、こんなかんじです。

あとは、アプリケーション毎(プログラム毎)のvbsファイルを実行(ダブルクリック)すれば、UACを回避して起動するはずです。

OSログイン時にまとめて起動したい場合

通常のようにスタートアップフォルダに~.vbsファイルを置くと、
起動時の「UAC回避.vbs」より先に呼び出される、
あるいは競合するなどの問題が発生する可能性があります。
この為、私は以下のように対応しています。


タスクスケジューラに以下のタスクを登録

 全般→管理者権限でまとめて起動
 トリガー→ユーザのログオン時
 操作→プログラムの開始(管理者権限でまとめて起動.vbsを指定)

管理者権限でまとめて起動.vbsの中身
(サンプルで、3つのプログラム(AutoHotkey.,WinShot.exe,QShot.exe)を起動しています)

 Option Explicit
 Dim objWshShell ' WshShell オブジェクト
 Dim objFileSystem
 Dim objFilePath
 Dim strAppPath
 '' ===ここにプログラムのフルパスを設定===
 strAppPath = "D:\tools\AutoHotkey\AutoHotkey.exe"
 Set objWshShell = WScript.CreateObject("WScript.Shell")
 Set objFileSystem = CreateObject("Scripting.FileSystemObject")
 Set objFilePath = objFileSystem.GetFile(strAppPath)
 objWshShell.CurrentDirectory = objFileSystem.GetParentFolderName(objFilePath.ShortPath)
 Call objWshShell.Run("cmd.exe /c start /NORMAL " & objFilePath.ShortPath ,0,False)
 '' ===ここにプログラムのフルパスを設定===
 strAppPath = "D:\tools\cg\ws\WinShot.exe"
 Set objFilePath = objFileSystem.GetFile(strAppPath)
 objWshShell.CurrentDirectory = objFileSystem.GetParentFolderName(objFilePath.ShortPath)
 Call objWshShell.Run("cmd.exe /c start /NORMAL " & objFilePath.ShortPath ,0,False)
 '' ===ここにプログラムのフルパスを設定===
 strAppPath = "C:\Program Files (x86)\QShot\QShot.exe"
 Set objFilePath = objFileSystem.GetFile(strAppPath)
 objWshShell.CurrentDirectory = objFileSystem.GetParentFolderName(objFilePath.ShortPath)
 Call objWshShell.Run("cmd.exe /c start /NORMAL " & objFilePath.ShortPath ,0,False)
 ''起動するプログラム毎に、以下の設定を追記
 '''' ===ここにプログラムのフルパスを設定===
 ''strAppPath = "C:Program FilesSpeccySpeccy64.exe"
 ''Set objFilePath = objFileSystem.GetFile(strAppPath)
 ''objWshShell.CurrentDirectory = objFileSystem.GetParentFolderName(objFilePath.ShortPath)
 ''Call objWshShell.Run("cmd.exe /c start /NORMAL " & objFilePath.ShortPath ,0,False)

参考url
「直天堂のカステラ」様「Windows7 UAC(ユーザーアカウント制御)対策」