見出し画像

【Tips】windowsのBATファイルを自動で管理者実行する方法

weekly_report

どうも、3人目です。

今回はすご~く適当なお話になりますが、windowsの管理者だと時折発生する「管理者実行」を簡略化する方法についてTipsとして記事を書こうと思います。

題名のBAT利用時の管理者権限の実行を自動化する方法とは、別に「win」+「R」での、「ファイル名を指定して実行」から管理者権限実行する方法も記載します。

BATファイルを自動で管理者実行するコード

背景と実際のコード

こんな経験ないでしょうか。

管理者権限を持つユーザで保守管理をしているのに、運用BATを実行する際に手順書に、

「BATを右クリックして「管理者権限として実行」を選択して実行する」

なんてことが。
(厳密にはビルドインadministratorとadministratorグループのユーザでは実行の挙動が少し違うため仕方ない。。。)

毎回「右クリックして管理者権限として実行」なんてかっこ悪いことはしたくないよ!
ってことで、以下のようなBATを作成いたしました。

@echo off
@setlocal enabledelayedexpansion

REM ##以下が自動でadmin実行してくれるバッチの実行コード
set PATH1="%0"
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
  @powershell start-process "%PATH1%" -verb runas
  exit
)

REM ##以上が自動でadmin実行してくれるバッチの実行コード
REM 以下に実行したいコードを記載する

whoami /priv
echo "権利者権限で実行されているよ"

コードの解説はするまでもないかもしれませんが後ほど、運用利用する際に心配な方のために記載します。

すぐに運用に乗せないといけない方は上記コードでBATファイルを作成の上で「REM 以下に実行したいコードを記載する」より、下の部分に実際に管理者権限で実行したいコードを書いてください。

もう、右クリ管理者権限からは卒業です

ちなみに、そんな環境は存在しないと思いますが、Powershellが実行できないようなwindows環境だと本スクリプトは利用できませんのでご注意を。


コードの解説(一応)

さて、運用に乗せるにあたって、
「おいおいBATファイルなんてバカでもクリックしたら、実行されるようなファイルなんだからコードの解説は少し載せてくれよ」って方に向けて簡単に解説を。

まずは上から、以下のコードの解説

whoami /priv | find "SeDebugPrivilege" > nul

こちらは、自身の現在の権限がどういったものかを確認するものになります。管理者権限で実行を行うと「SeDebugPrivilege」が権限に付与されるためこちらが存在するかを確認します。

次の「if %errorlevel% neq 0 」は言うまでもなく前回実行したコマンドのエラーレベル(返り値)が0でないことを確認します。
ここでは、管理者権限で実行されているか否かを確認して、管理者権限でない場合はif文内部のコードに遷移します。

さて、次のコードが本BATの肝になります。

@powershell start-process "%PATH1%" -verb runas

こちらが、「(powershellから)本BATを改めて管理者権限で実行を行う。」ことを記載したコードになります。

なので、Powershellが実行できない環境だと本スクリプトは利用できないわけです。

なんか、解説するまでもなかった感じが凄くありますが、こんな感じ。

ちなみに、一番上のsetコマンドについてですが、

set PATH1="%0"

これを入れている理由は、私の環境が影響していて、

BATでの、%0は「自分自身」すなわち、「BATファイル自身」を指すのですが、実行環境のフォルダ名などによっては正しくBATファイルのパスを実行できない事象が発生したので、記載しています。

単純な話なのですが、ブランク( )やハイフン(-)があるようなフォルダ名の場所で実行すると、ブランクは引数として、ハイフンはcmdのオプションとして、誤認して実行しようとするので、一度変数に置き換えた上で実行するようにしています。
(私の場合はonedriveの命名規則(?)に起因して上記記載が必要だった)

もしも、「右クリックで管理者権限として実行」に嫌気がしている方がいらっしゃいましたら、本BATファイルを使ってストレスの無い運用Lifeをお送りください。
(exeファイルとかもこれに記載すれば実行できると思います。)

「ファイル名を指定して実行」にて管理者権限で実行する方法

さて、こちらは小見出し程度ですが、こちらも手順書あるあるなのではないでしょうか?

「スタート画面からコマンドプロンプトを検索したうえで右クリックして管理者権限として~」

なんて、こった、コマンドプロンプトなどの実行のために上記BATを作成するのはバカバカしい、でももっと簡単に管理者権限で実行できないものか。。。

あります、「Win」+「R」で実行できる「ファイル名を指定して実行」から実は管理者権限での実行が可能です。

ファイル名を指定して実行


上記画面の状態で、「ctrl」+「shift」+「Enter」を押してプログラムを実行すると、管理者権限実行されます。

これを知ったときは、目からうろこでした。(そりゃ実行方法あるよな、とは思いつつ)

今度から手順書には、「sytem32で実行されていること」とか「管理者の記載がウインドウ部分に記載されていること」って書いて終わりにしよう。

まとめ

さて、windows系の管理を行っていると、何かと付きまとってくる「管理者権限として実行」の簡略化方法についてTipsとして記載しました。

管理者権限での実行に囚われているwindows管理者の助けになればと思います。

次回はActiveDirectoryのユーザ認証周りを解説したいな~と考えてます。(筆者自身あまり知識がないので勉強のためにも)

では、また

追記(powershell版)

powershell版もわけあって作ることになり、コードだけ記載しておきます。

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    $argsToAdminProcess = ""
    $Args.ForEach{ $argsToAdminProcess += " `"$PSItem`"" }
    Start-Process powershell.exe "-File `"$PSCommandPath`" $argsToAdminProcess" -Verb RunAs
    exit
}

スクリプトの先頭に上記コードを記載すれば実行時に、自動で管理者権限で実行します。

では、

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!