この記事について
| 環境 | Windows7、UWSC |
|---|---|
| 目的 | キーボード・マウス入力を禁止するLOCKHARDを使えるようにする |
| 結果 | 管理者権限が必要な関数を使うときだけ、UacElevateで権限昇格ダイアログを出すようにした |
つまずきポイント要約
- LOCKHARDは管理者権限がないときちんと動かない
- .uwsファイルから実行するとコンテキストメニューに「管理者として実行」が出ない
- 特権レベルにチェックを入れる方法は毎回昇格確認ダイアログが出て面倒
LOCKHARD は、キーボードやマウスからの入力を禁止する関数。
LOCKHARD関数は、管理者権限がなければ、きちんと動かない。
テストスクリプト1
LOCKHARD(TRUE)
FOR A = 10 TO 1 STEP -1
FUKIDASI("入力禁止中(あと" + A + "秒)。強制解除はCtrl + Alt + Delete",100,100,0,40)
SLEEP(1)
NEXT
テストスクリプト2
LOCKHARD(TRUE)
//100秒キー入力無効!強制解除はCtrl + Alt + Delete
SLEEP(100)
LOCKHARD(FALSE)
LOCKHARD関数がきちんと動かないのなら、管理者権限がないということ。
管理者権限があるかどうかは以下のスクリプトでわかる
DEF_DLL IsUserAnAdmin(): BOOL: shell32
IFB IsUserAnAdmin() THEN
MSGBOX("管理者権限あり")
ELSE
MSGBOX("管理者権限なし")
ENDIF
管理者権限を有効にするには、uwsc.exe か そのショートカットのコンテキストメニューを開き、「管理者として実行」でプログラムを起動させる。
しかしこの方法だと、拡張子が「.uws」のファイルから実行するとコンテキストメニューの「管理者として実行」の項目が無くてできなかった。それに毎回右クリックするのが面倒。
UWSCを常に管理者権限でプログラムを走らせるために、互換性タグ下の 特権レベル「管理者としてこのプログラムを実行する」 にチェックを入れる、という方法もあるがプログラムを開始するたびに「権限の昇格を確認するダイアログ」が出てこれも面倒。
結局、管理者権限が必要な関数(LOCKHARD 等)を使う場合だけ、管理者権限へ昇格するダイアログを出すことにした。
//管理者権限が無ければ、管理者権限のダイアログを出す
DEF_DLL IsUserAnAdmin(): BOOL: shell32
if ! IsUserAnAdmin() then
UacElevate()
exit
endif
LOCKHARD(TRUE)
FOR A = 10 TO 1 STEP -1
FUKIDASI("入力禁止中(あと" + A + "秒)。強制解除はCtrl + Alt + Delete",100,100,0,40)
SLEEP(1)
NEXT
procedure UacElevate(arg = "")
if pos(".exe", GET_UWSC_NAME) then
exe = GET_UWSC_NAME
dir = GET_CUR_DIR
else
exe = "UWSC.exe"
dir = GET_UWSC_DIR
arg = "<#DBL>" + GET_CUR_DIR + "\" + GET_UWSC_NAME + "<#DBL> " + arg
endif
sh = CreateOleObj("Shell.Application")
sh.ShellExecute(exe, arg, dir, "runas", 1)
fend
参考ページ
https://stuncloud.wordpress.com/2012/09/07/uwsc_uac_elevation/
