【UWSC】Windows7でLOCKHARDを有効にする

この記事について

環境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/
タイトルとURLをコピーしました