【Windowsコマンドライン】管理者権限でbat実行しファイルをネットからダウンロード

Tips
スポンサーリンク

今回は、自社のユーザーの端末に、あるソフトのインストーラーを一斉に配布して実行してもらう必要があり、Windowsのbatファイルを作成しました。

参考までにその実装サンプルを紹介いたします。
 

実装処理概要

今回作成したプログラムの作成経緯や処理の目的は以下です。

  • 管理している千台以上のWindows端末に、あるソフトのインストーラーを配布したい。
  • インストーラーは32bit用と64bit用が有り、社内の端末は両アーキテクチャが混在。
  • インストーラーは管理者権限で実行させたい。
  • ユーザーにインストール作業をやらせたいが、必要な作業は極力減らしたい。
  • インストーラーを右クリックして「管理者権限で実行」を実施してくれない恐れがある。
  • インストーラーが32bit用と64bit用の二種類あり、ユーザーが正確に選択することは困難。
  • ユーザーの端末は直接インターネットに繋いでいる環境が大半でありインストーラーの配布もネット経由で。

これらの要件を踏まえて、以下の構成で処理を作成しました。

  • インストーラーはWebサーバーの公開ディレクトリに配置。
  • bat形式のスクリプトを作成し、ユーザーの作業はそれを実行するのみ。
  • 管理者権限でのbat実行や、自端末のアーキテクチャ判別はプログラムで実施。
  • インストーラーのダウンロードや実行も自動化。

上記の構想をイメージ図にしたものは以下です。

では、早速次の項で、対象のbatファイルの実装サンプルを紹介していきます。
 

batサンプルコード

今回実装したbatプログラムのサンプルコード紹介します。

最初に、自身が管理者権限で実行されたか否かを判定し、管理者権限で実行されていなければ、Powerhsellから管理者権限で起動しなおします。
その後アーキテクチャの判定をして処理を分岐します。
アーキテクチャに合ったインストーラーファイルをbitsadminでダウンロードして実行します。

@echo off

REM 管理者として実行されているかを判定します。
echo 管理者として実行されているか判定します。
for /f "tokens=3 delims=\ " %%A in ('whoami /groups^|find "Mandatory"') do set LEVEL=%%A
if not "%LEVEL%"=="High" (
    REM Powershellを起動し、以降のコマンドを管理者権限で実行します。
    echo 管理者として実行しなおします。
    powershell -NoProfile -ExecutionPolicy Unrestricted -Command "Start-Process \"%~f0\" -Verb runas"
    exit
)
echo 自端末のアーキテクチャを判定します。
REM 自端末のアーキテクチャが32bitか64bitかを判定してインストーラーをダウンロードします。
set PF32=%ProgramFiles(x86)%
if exist !%PF32%! (
    REM 64bit端末用インストーラーをダウンロードします。
    bitsadmin /transfer dl_64 http://example.com/DownloadFile/sample_64.exe %USERPROFILE%\Desktop\sample_64.exe
    REM インストーラーを実行します。
    call %USERPROFILE%\Desktop\sample_64.exe
    REM 処理を終了します。
    exit    
) else (
    REM 32bit端末用インストーラーをダウンロードします。
    bitsadmin /transfer dl_32 http://example.com/DownloadFile/sample_32.exe %USERPROFILE%\Desktop\sample_32.exe
    REM インストーラーを実行します。
    call %USERPROFILE%\Desktop\sample_32.exe
    REM 処理を終了します。
    exit    
)

bitsadminの構文など

Windowsではコマンドプロンプトでインターネット上のファイルをダウンロードするツールとして「bitsadmin」が提供されています。
尚、Microsoftでは、bitsadminの利用は非推奨で、Powerhsellを使うようにアナウンスしています。
このbitsadminの構文は以下です。

bitsadmin /transfer <ジョブ名> <ダウンロード先URL> <ファイル保存先フルパス>
ジョブ名 bitsadminでの一つの処理をジョブと呼び、そのジョブの名称を指定します。
例えばダウンロード処理を止めたり進捗を確認する場合にこのジョブ名を指定しますが、ダウンロードするだけなら適当な名称で結構です。
ダウンロード先URL ダウンロード先URLを指定します。
尚、bitsadminでは、httpsが使用できません。
httpでURLを指定してください。
ファイル保存先フルパス ダウンロードしたファイルの保存先をファイル名を含んだフルパスで指定します。

 

最後に

今回は、インターネットを介してファイルをダウンロードして管理者権限で実行する一連の処理をWindowsのbat形式で実行するサンプルコードを紹介しました。
実は今回のサンプルコードは、過去に公開した以下の記事で紹介したものを流用しています。

この記事で紹介したEmotetは今や無事収束し、この記事が検索される機会もかなり減ったこともあり、再度同じようなサンプルコードを紹介させていただいた次第です。
今回も当処理がどなたかの助けになれば幸いです。
今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう!

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