犬でもわかるバッチファイルの作り方〜管理者権限で実行しよう

Windows10

前回ディレクトリの重要性を学んだ新人エンジニア。

しかし喜びもつかの間、バッチファイルによっては管理者での実行を求められて処理が実行されないという問題が立ちはだかる。

果たして新人エンジニアに対抗策はあるのか・・・!

前回の記事

管理者権限はなぜ必要か

正直何かするたびに出てくるの邪魔だなぁ・・・。そう思ってる方が多いと思います。私もそう思います。

それでもパソコンを守るためのセーフティとしてなくてはならないものなのです。

もし管理者権限を求められずに好き勝手にパソコンの設定を変更したり、むやみやたらにプログラムインストールできたらどうなるでしょう。

何かの拍子にデータが破損して、そのままパソコン自体が使えなくなってしまう可能性もないとは言えません。

個人のパソコンなら「まぁ自己責任だよねHAHAHA!」で終わる話ですが、会社のパソコンだったとしたらもう目も当てられない事態に発展してしまうかも。

そういう危険があるからこそ、チェックの意味も含めて必要で重要な機能なのです。

でもやっぱり面倒・・・

まぁ、重要なのは分かるんですが、間違えた時にいちいち「管理者権限がないから」と締め出しを食らって実行しなおすのは時間のロスだし面倒です。特に何百台ものパソコンのキッティングとなればなおさら。

というわけで一発で実行できるいい方法がないか探してみましょう。

runas

なるほど、コマンドプロンプトにおいては”runas”を使えば管理者として実行できるようです。

しかしこれだとパスワードを求められる様子。となると処理を自動的に且つ順番に実行されてしまうバッチファイルだと使えないですね。

もう少し調べてみましょう。

start-process 実行対象 -verb runas

この見出しのコマンドレットはPowerShellでプログラムを管理者権限で実行するためのものです。

おお!これはずいぶんスマートに書けるしパスワードもいらないようです。これを使っていきましょう。

ちなみにこのコマンドレット、どんな処理なのでしょう?

Start-process 実行対象

ここはいたってシンプル実行対象を実行します。例えばメモ帳を開くなら

start-process notepad.exe

です。でもこれだけだとダブルクリックで起動しているのと変わりません。

管理者権限で実行するにはもうひと手間必要となります。

-verb runas

start-process のオプションである -verb で、プロセス実行時のアクションを指定することができます。

例えばHello.txtというファイルの中身を印刷したいなら

start-process Hello.txt -verb print

です。

“runas”は管理者として起動するコマンドというお話は既にしましたね。つまり

start-process 実行対象 -verb runas

は「実行対象を管理者として実行する」という意味です。

ただこれはあくまで PowerShell で使うコマンドレットです。そのままではバッチファイルで使えません。バッチファイルで powershell と最初に入れるとPowerShellのコマンドが使えます。

つまり最終的な形は

powershell start-process 実行対象 -verb runas

という形です。

さぁ準備は整いました。実際に使ってみましょう!

学んだすべてをぶつける!

管理者権限で動かす

今回は、カレントディレクトリに file.txt というファイル(中身は”Hello”)を作成するバッチファイルを、管理者権限で動かしてみます。

まずは管理者権限で実行するバッチファイルを用意します。仮に「test.bat」としましょう。

▼test.bat

powershell start-process hello.bat -verb runas

pause

exit

そしてファイルを作成する「hello.bat」。

▼hello.bat

cd /d %~dp0

echo Hello > file.txt

pause

exit

これらをデスクトップ上に作ったtestフォルダに入れて、

いざ起動!

下段の通り、hello.bat は無事動いています。

また file.txt も無事 test フォルダ内に作成されました!

▼中身

つまりそれは test.bat はちゃんと思ったとおりに動いてくれたと言うこと!無事完成です!

・・・いないとは思いますが2つに分けるのが面倒だからといって、全てをhello.batにまとめて以下のように書くのはダメですよ?

powershell start-process hello.bat -verb runas

cd /d %~dp0

echo Hello

pause

exit

こんな書き方をしたら最後、延々とループしてパソコンがクラッシュしてしまいますからね!

起動したプロセスが終わるまで待つには

“start-process”を使って複数のbatやその他プログラムを起動させると、全てが同時に実行されてしまいます。

こんな時は

-verb runas -wait

のように -wait を追加しましょう。これで start-process で起動したプロセスが終了するまで後続処理は待ちになります。

最後に

いかがでしたでしょうか?

2回にわたってお送りしました「犬でもわかるバッチファイルの作り方」。

カレントディレクトリの指定と管理者権限の付与。この2つはバッチファイルを作るうえで重要な基礎の部分でもあります。

私と同じ新人エンジニアの皆さん!しっかり覚えて使いこなせるようにしましょう!