【Bat】バッチが管理者権限で実行できているか確認判定する方法

Windows

こんにちは!今回はバッチファイルが本当に管理者権限で実行できているか確認する方法をまとめておきます。

OpenFiles

OpenFIlesでのサンプルコード

openfiles > nul

if %errorlevel% neq 0 (
echo 管理者権限がありません。管理者権限で実行してください。
pause
exit
)

[管理者権限が必要な処理]

もっとも簡単でよく使われるものかと思います。
OpenFIles自体が管理者権限がないと実行できないため、その性質を利用したものになります。
しかし、アカウントに管理者権限がついているがユーザー権限で実行するなどといったケースで、中途半端に権限がなかったりします。(OpenFIlesは実行できるが、レジストリ編集はできないなど)

Whoami

Whoamiコマンドでのサンプルコード

whoami /priv | find "[特権名]" > nul

if %errorlevel% neq 0 (
echo 管理者権限がありません。管理者権限で実行してください。
pause
exit
)

[管理者権限が必要な処理]

※[特権名]はwhoami /privの結果で管理者権限がある時にしか出力されない値を使用します。

whoamiでは一般権限と管理者権限で取得できる情報の差を利用して権限を判断します。

手動でコマンドを実行してみるとこれだけの差が出てきます。
そのため、FindコマンドにてWhoamiの結果を任意の[特権名]で検索し、見つからなかった場合あ一般権限とみなせます。
一般権限と管理者権限を完全に一致させてるなどというトンデモない環境でなければこれで判定できます(そもそもそんな環境だったら管理者権限実行いらないですね)

個人レベルでの利用であればさほど影響はないのですが、いろんな現場を回るような方は同じ[特権名]だと環境によって判定できないこともありますので、展開前には手動で[特権名]に差異が出ることを確認したほうが良いと思います。

レジストリを編集して判定

あまりオススメの方法とは言えないのですが、自分の仕事上確実に行うためにこの判断方法をよく使います。
そもそも管理者権限が必要な処理はレジストリの書き換えがほとんどではないでしょうか。(※環境によるとおもいますが。)
そのため、最初に影響のないレジストリに書き込むことで判定してしまえば、確実にレジストリ書き換えができる確証が取れます。

レジストリを利用したサンプルコード

reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v "test" /t "REG_SZ" /d "cmd" /f >Nul

if %errorlevel% neq 0 (
echo 管理者権限がありません。管理者権限で実行してください。
pause
exit
)

reg delete "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v "test" /f

[管理者権限が必要な処理]

一旦影響のなさそうなコマンドをRunOnceレジストリに書き込みます。
別に問題なければどのレジストリでも可能ですが、RunOnceであれば影響のないコマンドを登録しておけば勝手に消えてくれるのでここにしています。
もちろん自分で削除コマンドも実行させています。

この方法であれば、「レジストリを書き換えることができる権限であること」であることは確定できます。

まとめ

  • よく使われるのはOpenFilsでの判定
  • より確実に判定したいならWhoami
  • レジストリの変更を確実にしたいなら書き込みテスト

環境や作業の目的によって使い分ける必要があると思いますが、最終的に行いたい処理をしっかり見据えて管理者権限判定は行うべきだと思います。
ご参考になれば幸いです。

コメント

  1. […] 【Bat】バッチが管理者権限で実行できているか確認判定する方法 | Correct-Lo… […]

Translate »
タイトルとURLをコピーしました