はじめに:@wikiからwikiwikiに緊急移設した際のデッドリンク、添付ファイルなどを修正しました。(2014/7/14)
制御(UAC)により、管理者権限昇格ダイアログが出るようになりました。
(正確には、client.exeは通常ユーザ権限、UO.exe、UOPach.exe、UOAssistは管理者権限で実行されるようになりました)
ってことで、クライアントに干渉するアプリケーションも管理者権限でないと、干渉できません。
権限不足で干渉できないと、UOAMなら自動追尾がうまく動かなくなるとか、
WinShotではPrintScreenキー単独でSSを撮れなくなる場合があるなどの問題が発生します。
注意:管理者権限に昇格するためには、一般ユーザではなく管理者ユーザでログインする必要があります。
でも管理者権限昇格ダイアログはうざいですよね。
だからってUACは切っちゃダメ!
こうして、
こうすれば簡単だけど、絶対ダメ!!
じゃぁ、どうすればいいのよ?ヽ(`Д´)ノウワァァァン!!
ごもっともです。
そこで!ですよ!!
じゃぁ対処しましょう。憎たらしい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\に入れています。
ちなみに中実はこんな感じです。
''↓コピーするときはココをコピーしてください 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」と入力。
で、「OK」ボタンを押下。
2.2.タスクの作成
こんなウィンドウが開いていると思いますので、「操作」→「タスクの作成」をクリック。
「名前(M):」に「UACEscape」と入力し、「最上位の特権で実行する(I)」にチェック。
2.3.タスクの操作(動作)を登録
ここも重要です。
「操作」タブをクリックし、「新規(N)」を押下。
「新しい操作」ダイアログが開きますので、
「参照(R)」ボタンを押下し、「1.共通ファイルを作成(ダウンロードすればおk!)」で保存したUAC回避.vbsを選択。
「引数の追加(オプション)(A):」に「$(Arg0)」と入力。
入力内容をちゃんと確認し、「OK」ボタンを押下。
2.4.確認していきます。
「タスクの作成」ダイアログで、「操作」タブに、
操作「プログラムの開始」
詳細「保存したUAC回避.vbsのフルパス+$(Arg0)」
となっていることを確認し、「OK」ボタンを押下。
「タスクスケジューラ」ウィンドウの中央に、
「UACEscape」があることを確認し、タスクスケジューラを閉じてください(右上のXをクリック)
3.UAC回避したいアプリケーション毎(プログラム毎)のファイルを作成
アプリケーション毎(プログラム毎)に以下のファイルを作成します。
アプリケーション毎(プログラム毎)に変更するところは、「ファイル名」、「アプリケーションのフルパス」です。
※アプリケーションのフルパスの調べ方は後述いたします
''↓コピーするときはココをコピーしてください 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 & """"
アプリケーションのフルパスを調べる方法
まず、スタートメニューをたどっていって、調べたいアプリケーションを右クリックし、プロパティをクリック。
プロパティダイアログが表示されますので、反転している「リンク先(T)」がアプリケーションのフルパスです。
アプリケーションにパラメータを渡したい場合
たとえばメモ帳にパラメータを渡したい場合
こんなかんじで、実行ファイルの直後(パラメータの先頭)にカンマ「,」を入れてください。
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)