「モダンブートメニュー」アプリで遊んでいたら、高機能(?)シャットダウン/再起動ツールができちゃった:その知識、ホントに正しい? Windowsにまつわる都市伝説(215)
本連載第211回では、Windows 10の「モダンブートメニュー」が実際にはレガシーなWin32アプリであることを紹介しました。その後、もう少しこのアプリで遊んでみたら、実に面白いものが出来上がりました。
「モダンブートメニュー」でもっと遊ぼう!
「モダンブートメニュー」(「イマーシブブートメニュー」とも呼びます)は、「Windows 8」から導入された、タッチ操作対応の新しいブートメニューです。タッチ操作に対応できるように、このメニューはブートの最終段階で表示され(表示される場合)、既定のブートエントリを選択すればすぐにログオン画面に切り替わりますし、別のブートエントリやトラブルシューティングツールを選択すると、一度、再起動してから選択したものが実行されます。
本連載の第211回では、モダンブートメニューが「C:\Windows\System32\Bootim.exe」というWin32アプリケーションであること(イマーシブ《UWP》アプリではなく!)、それがブートの最終段階の「Windowsログオンアプリケーション(Winlogon.exe)」から開始されていること、レガシーブートメニュー環境では使える起動直後の[F8]キーや[F10]キーが使えなくなる理由、ログオン後に通常のWin32アプリケーションとしてエクスプローラーからのダブルクリックや「コマンドプロンプト(cmd.exe)」から実行できることとその挙動、アクセス権による表示の違いなどについて解き明かしました。
- Windowsのモダンブートメニュー、その正体はレガシーなアプリだった?(本連載 第211回)
通常のWin32アプリケーションとして実行した場合、「PCの電源を切る」を選択しても電源が切れないなど、選択されたメニューに対応した挙動にならないのは、呼び出し元(「Winlogon.exe」ではない「cmd.exe」)が何もしないからです。
では、呼び出し元がやればいいということで、バッチファイル(.cmd)でモダンブートメニューの戻り値を取得して、対応させてみることにしました。
簡単なバッチファイルを作って、「bootim.exe」の戻り値(%ERRORLEVEL%で取得可能)を調べてみると、「PCの電源を切る」を選択した場合の戻り値は「641」で、「続行」(管理者として実行した場合に表示)を選択した場合の戻り値は「0」でした。管理者として実行した場合に表示される他の項目については面倒なのでひとまず省略します。
本当にシャットダウンできるようにしてみた
というわけで、「PCの電源を切る」と「続行」の処理に対応したバッチファイルを以下の画面1のように作成してみました(実際のバッチスクリプトは、さらに改良した別のバッチファイルをこの後示すので省略します)。
このバッチファイルをデスクトップなどに配置してダブルクリックすれば「PCの電源を切る」オプションだけが表示され、それを選択するとバッチファイルに戻り、シャットダウン(SHUTDOWN /S /T 0)コマンドの実行へと進みます(画面2)。「PCの電源を切る」オプションしか表示されないのは、「ブート構成データ(BCD)」へのアクセスやその他の操作に必要なアクセス権がないからです。
バッチファイルを右クリックして「管理者として実行」を選択すると、「ユーザーアカウント制御(UAC)」の昇格プロンプトを経て、実際のブート時に表示されるのと同じ項目を持つメニューが表示されます。
ただし、このバッチファイルが対応しているのは「続行」と「PCの電源を切る」だけです。「PCの電源を切る」を選択すると、先ほどと同様にシャットダウンを開始します。「続行」を選択すると、単純にバッチファイルを終了して戻ります(ローカルコンソールで操作している場合はカーソルが消えてしまうかもしれませんが、ログオンし直せば解消します)。他の項目を選択した場合は、“使えません”メッセージを表示して終了します(画面3)。
意図せず開始したコマンドプロンプトがヒントに!
このバッチファイルを作成するために、いろいろと項目を選択して試行錯誤していたら、通常起動時に「このPCを初期状態に戻す」や「コマンドプロンプト」が意図せず表示されることがありました。管理者としてバッチファイルを実行し、「続行」と「PCの電源を切る」以外の項目を選択したときの挙動が次回再起動時に始まったように見えます。
戻り値を調べてみると、「続行」と「PCの電源を切る」以外の項目の戻り値は全て「3010」でした。「デバイスの使用」「トラブルシューティング」「別のオペレーティングシステムの使用」は、通常のモダンブートメニューの際には既定のブートエントリではない項目であり、再起動してから選択した動作を示すものです。
言い換えると、別ブートエントリの選択または既定のブートエントリのブートオプションを書き換えた上で再起動が行われます。つまり、ログオン後に「bootim.exe」を管理者として実行し、これらの項目を選択した場合も、同様のことがブートエントリに対して行われたということになります。戻り値「3010」が共通しているのは、それが再起動を伝えるためのものだからだと想像しました。
そこで、次のようにバッチファイルを書き換えてみました。全ての項目を選択して確かめたわけではありませんが、他のメニュー項目もこれで機能するようになるはずです。ログオン中のデスクトップから開始できるWindowsブートメニュー、“高機能シャットダウン/再起動ツール(トラブルシューティング機能付き)”の爆誕です(画面4)
@echo off bootim.exe IF %ERRORLEVEL% == 0 GOTO CONTINUE IF %ERRORLEVEL% == 641 GOTO SHUTDOWNNOW IF %ERRORLEVEL% == 3010 GOTO REBOOTNOW TIMEOUT 10 GOTO END :CONTINUE ECHO [続行]がクリックされました。Windows に戻ります。 TIMEOUT 10 GOTO END :SHUTDOWNNOW ECHO [PC の電源を切る]がクリックされました。シャットダウンを開始します... TIMEOUT 10 SHUTDOWN /S /T 0 GOTO END :REBOOTNOW ECHO 何かトラブルシューティング オプションが選択されました。再起動します。 TIMEOUT 10 SHUTDOWN /R /T 0 GOTO END :END
筆者紹介
山市 良(やまいち りょう)
岩手県花巻市在住。Microsoft MVP 2008 to 2023(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Windows 11一般提供開始、企業での導入/展開時に注意すべきポイントは?
MicrosoftはWindowsデスクトップOSの最新バージョンである「Windows 11」を正式にリリースし、Windows 11対応ハードウェアを搭載したWindows 10デバイスに対して、無料アップグレードの段階的なロールアウトを開始しました。 - Windows 11登場! 11で変わること、思ったほど変わらないこと
新しいWindows OS「Windows 11」の正式出荷が2021年10月5日に開始された。Windows 10からの無償アップグレードが可能であるため、どのような新機能が実装されたのか気になる人も多いのではないだろうか。そこで、本稿ではWindows 11の新機能、削除された機能などを簡単にまとめてみた。 - 買って、試して分かったWindows 365(契約・セットアップ編)
Microsoftからクラウド上でWindows 10が動く「クラウドPC」の利用可能なサブスクリプションサービス「Windows 365」の提供が開始された。早速、サブスクリプションを契約し、クラウドPCの設定を行ってみた。契約からセットアップまでで見えてきた便利な点、不便な点などをまとめてみた。 - いよいよ完全終了へ。Internet Explorer(IE)サポート終了スケジュール
長らくWindows OSに標準装備されてきたInternet Explorer(IE)。その「寿命」は各種サポートの終了時期に左右される。Windows OSごとにIEのサポート終了時期を分かりやすく図示しつつ、見えてきた「終わり」について解説する。