がらくた置き場

がらくただけど、心を込めて。

UACの権限昇格呪文2種類

f:id:syamatsumi:20210602220733p:plain

バッチファイルで何かしら自動実行する際に、管理者権限で実行する必要のある操作は数多いものの、権限を昇格させるの忘れて操作に失敗していた、という事態は結構多いものです。

なので、先に実行権限を確認し、必要なら昇格させるような呪文をバッチファイルの先頭に突っ込んでおけば、昇格忘れを防止出来るので、僕はこれらを結構多用しています。

権限不足による実行失敗に後で気付いてギャーってなってる皆様に是非ご活用頂きたい奴ですね。

 

 

1) シンプルな呪文

@echo off
REM 権限を自動で確認し、必要なら昇格ダイアログを出す。
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
    echo 管理者権限がありません。管理者権限で実行します
    @powershell start-process \"%~0\" -verb runas
    exit
)
REM ここから下に処理内容を記述します。

元ネタはこちらで紹介されているもの。

correct-log.com

 

2) 警告は出にくいけど若干ゴミが残る呪文

@echo off
REM 権限を自動で確認し、必要なら強引に昇格させる。
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 ( goto getPrivileges )
goto gotPrivileges

:getPrivileges
if '%1'=='ELEV' ( shift & goto gotPrivileges )
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%temp%\OEgetPrivileges.vbs"
exit /b

:gotPrivileges
setlocal & pushd .
REM ここから下に処理内容を記述します。

どうしても手数を減らしたい時に使う。
それでも昇格ウィンドウが出てくる環境では出てくるので、そんときは潔く諦めましょう!

元ネタはこちらで紹介されているもの。

dskr.hatenablog.com

 

3) 使用例

未接続のデバイスを表示できるようにするオプションが設定可能なデバイスマネージャーを管理者で開く。

@echo off
REM 権限を自動で確認し、必要なら昇格ダイアログを出す。
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
echo 管理者権限がありません。管理者権限で実行します
@powershell start-process \"%~0\" -verb runas
exit
)
REM ここから下に処理内容を記述します。

set devmgr_show_nonpresent_devices=1
start devmgmt.msc
exit

 

先人の知恵にマジで感謝…