コンテンツへスキップ

Windows 系OS で、リモートシャットダウンを設定する。

■ リモートで電源をオンにしたいのと同じくらい、リモートで電源をオフにしたい。

「リモートデスクトップ接続」や、「WOL」を設定しているのに、「リモートシャットダウン」は設定していなかったことに気が付いた。

画面がブラックアウトしてキーボードや、マウス操作を受け付けてくれない時や、
ハングアップした時の奥の手として設定しておくべき。

Windows 系OS でリモートシャットダウンする。

shutdown コマンドについて

コンピューターをシャットダウンするコマンドです。

例えば「shutdown /s」を実行すると即時コンピューターがシャットダウンします。

使用法:
C:\Windows\system32\shutdown.exe  [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f]
    [/m \\コンピューター][/t xxx][/d [p|u:]xx:yy [/c "コメント"]]

例:コンピューター名(IPアドレスでも可)を指定して再起動を 120秒後に実行する。
  shutdown /r( /s ) /m \\コンピューター名( or IPアドレス ) /t 120

例:やっぱりやめる。
  shutdown /a /m \\コンピューター名

引数の説明。※詳しくはヘルプ見てください。

    /?         ヘルプを表示します。オプションを入力しないのと同じです。
    /s         コンピューターをシャットダウンします。
    /r         コンピューターを完全にシャットダウンして再起動します。
    /a         システムのシャットダウンを中止します。
               これは、タイムアウト期間にのみ使用できます。
    /m \\コンピューター 対象となるコンピューターを指定します。
    /t xxx     シャットダウンまでのタイムアウト期間を xxx 秒に設定します。
               有効範囲は 0 から 315360000 (10 年) までで、既定値は 30 です。
               タイムアウト期間が 0 より大きい場合、/f パラメーターが
               暗黙的に指定されます。

「/m コンピューター名」を引数に指定すると、ネットワーク上のコンピューターのシャットダウンも可能です。

つまり、「リモートシャットダウン」ができます。

shutdown /m <コンピューター名 or IPアドレス> <オプション>

事前に仕込みをしないと「リモートシャットダウン」はできない。

shutdown コマンドを使うとリモート環境をシャットダウンすることが出来るわけですが、
デフォルトの状態ではシャットダウンできませんでした。

図1: PowerShellで「shutdown /m 192.168.3.202 /t 65000 /r」を実行してみたら「アクセスが拒否されました。(5)」と表示され、デフォルト設定のままではリモートシャットダウンできないことを確認している画面。
図1: PowerShellで「shutdown /m 192.168.3.202 /t 65000 /r」を実行してみたら「アクセスが拒否されました。(5)」と表示され、デフォルト設定のままではリモートシャットダウンできないことを確認している画面。

リモートシャットダウンに必要な3つの条件。

リモートシャットダウンをするには以下の「3つの条件」が必要です。

■ ポート445 経由での通信を許可するように設定する。
(ファイアウォールで受信規則を作成。)

■ シャットダウンするコンピューター上で管理者グループに入っている。

■ レジストリ「LocalAccountTokenFilterPolicy 」を設定をする 。

ポート445 の開放(ファイアウォール)

シャットダウンのコマンドは、445 番ポートを使って通信しますが、
基本的にファイアウォールは外部からの通信を遮断するので、
「445 ポートを使用した通信を許可する設定」を行います。

図2: Windowsファイアウォールの詳細設定で、445番ポート宛のTCP受信規則を新規作成しているところ。ローカルポートに445を指定している。
図2: Windowsファイアウォールの詳細設定で、445番ポート宛のTCP受信規則を新規作成しているところ。ローカルポートに445を指定している。

面倒な方はファイアウォールを解除。
※めちゃめちゃオススメしません。

図3: 面倒な人向けにファイアウォールごと無効化した例。プライベートネットワークのファイアウォールが「無効」になっている設定画面。
図3: 面倒な人向けにファイアウォールごと無効化した例。プライベートネットワークのファイアウォールが「無効」になっている設定画面。

シャットダウンするコンピューター上で管理者グループに入っている。

リモートでシャットダウンのコマンドを実行すると、下図のようなメッセージでアクセスが拒否されます。

図4: PowerShellで「shutdown /m \\192.168.3.21 /r /t 1」を実行し、「アクセスが拒否されました。(5)」と表示されている画面。管理者グループに入っていないとこうなる。
図4: PowerShellで「shutdown /m \\192.168.3.21 /r /t 1」を実行し、「アクセスが拒否されました。(5)」と表示されている画面。管理者グループに入っていないとこうなる。

シャットダウンのコマンドがリモート先で実行される際に、
UAC(※)が発生するため、「拒否されました」のメッセージが表示されてしまうとのこと。

※:これ。

図5: 「このアプリがデバイスに変更を加えることを許可しますか?」と表示されるUAC(ユーザーアカウント制御)の確認ダイアログ。
図5: 「このアプリがデバイスに変更を加えることを許可しますか?」と表示されるUAC(ユーザーアカウント制御)の確認ダイアログ。

これの対策として「管理者グループに入っている人からのコマンド実行時にUAC を発生させない」という設定を行います。

ですので実際は、「この後の設定のための仕込み」ということになるのですが、シャットダウンを行うユーザーを管理者グループに入れておきます。

例えば「unimoni」ユーザーでシャットダウンコマンドを実行するのであれば、
ターゲットのコンピューター上で「unimoni」が管理者グループに入ってないといけません。

シャットダウンを許可されたユーザーならOK というわけではなく、「管理者」である必要があります。

shutdown を実行するためのユーザーを作成。

図6: ローカルユーザーの新規作成画面。shutdownを実行させたいユーザー「unimoni」を作成し、パスワードを設定しているところ。
図6: ローカルユーザーの新規作成画面。shutdownを実行させたいユーザー「unimoni」を作成し、パスワードを設定しているところ。

管理者(Administrators グループ)にする。

図7: 作成したユーザーのアカウントの種類を「管理者」に変更しているWindowsの設定画面。
図7: 作成したユーザーのアカウントの種類を「管理者」に変更しているWindowsの設定画面。

レジストリ「LocalAccountTokenFilterPolicy」の設定をする。

(この設定が管理者グループはリモートコマンド実行時にUAC を発生させないという設定になります。)

レジストリエディタを開き、以下のキーに「LocalAccountTokenFilterPolicy」を追加します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

図8: レジストリエディタでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Systemキーを開き、新しいDWORD(32ビット)値を追加しようとしている画面。
図8: レジストリエディタでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Systemキーを開き、新しいDWORD(32ビット)値を追加しようとしている画面。

追加してから、値を修正する。

図9: 追加した値の名前を「LocalAccountTokenFilterPolicy」とし、値のデータを「1」に設定しているDWORD編集ダイアログ。
図9: 追加した値の名前を「LocalAccountTokenFilterPolicy」とし、値のデータを「1」に設定しているDWORD編集ダイアログ。
名前LocalAccountTokenFilterPolicy
種類 REG_DWORD
データ 1

図10: レジストリエディタの一覧に「LocalAccountTokenFilterPolicy」がREG_DWORDの0x00000001(1)として追加されたことを確認している画面。
図10: レジストリエディタの一覧に「LocalAccountTokenFilterPolicy」がREG_DWORDの0x00000001(1)として追加されたことを確認している画面。
参考

リモートのWindows PCのシャットダウン方法(shutdown.exe実行時の「アクセスが拒否されました。(5)」を解決する)

ログイン中のユーザー以外のユーザー権限でシャットダウンしたい。

コマンドを実行するユーザー名とターゲット上の管理者ユーザー名が一致しない場合に、
ターゲット上の管理者ユーザー名とパスワードを使用して、シャットダウンを実行します。

図11: 仮想マシン上のWindows設定「アカウント」→「ユーザーの情報」画面。ログイン中のユーザーとは別の管理者ユーザーでシャットダウンしたいケースの例。
図11: 仮想マシン上のWindows設定「アカウント」→「ユーザーの情報」画面。ログイン中のユーザーとは別の管理者ユーザーでシャットダウンしたいケースの例。

shutdown のコマンドを実行する前に、「net use」 を使って任意のユーザー認証をしておく。

現在のユーザーだとアクセス拒否されてしまう。

図12: コマンドプロンプトで「shutdown /m 192.168.3.202 /t 65000 /r」を実行し、「アクセスが拒否されました。(5)」となっている画面。ログイン中のユーザーのままだと拒否されてしまう例。
図12: コマンドプロンプトで「shutdown /m 192.168.3.202 /t 65000 /r」を実行し、「アクセスが拒否されました。(5)」となっている画面。ログイン中のユーザーのままだと拒否されてしまう例。

いったん、他の管理者グループユーザーで認証を通しておく。

net use \\<コンピューター名 or IPアドレス> /user:<ユーザー名> <パスワード>
図13: コマンドプロンプトで「net use \\192.168.3.202 /user:1st_user」を使って管理者ユーザーの認証を通し(「コマンドは正常に終了しました」)、その後改めてshutdownコマンドを実行すると今度は拒否されないことを確認している画面。
図13: コマンドプロンプトで「net use \\192.168.3.202 /user:1st_user」を使って管理者ユーザーの認証を通し(「コマンドは正常に終了しました」)、その後改めてshutdownコマンドを実行すると今度は拒否されないことを確認している画面。

リモートシャットダウン先のPC での表示

図14: リモートシャットダウン先のPCに表示される「Windows ログオン通知」。「サインアウトしようとしています。Windowsを10833分後にシャットダウンします。」というメッセージが出ている。
図14: リモートシャットダウン先のPCに表示される「Windows ログオン通知」。「サインアウトしようとしています。Windowsを10833分後にシャットダウンします。」というメッセージが出ている。

powershell のコマンドを使う

「shutdown」ではユーザーが指定できないので、powershell のコマンド「Restart-Computer」を使います。

Microsoft Docs Restart-Computer

Restart-Computer -Force -ComputerName "コンピューター名" -Credential (Get-Credential)

実行後にシャットダウンを実行する「ユーザー名とパスワード」を入力する。

図15: PowerShellで「Restart-Computer -Force -ComputerName "vm-win11" -Credential (Get-Credential)」を実行し、資格情報入力ダイアログにユーザー名とパスワードを入力しているところ。
図15: PowerShellで「Restart-Computer -Force -ComputerName “vm-win11” -Credential (Get-Credential)」を実行し、資格情報入力ダイアログにユーザー名とパスワードを入力しているところ。

条件は「shutdown」の3つの条件と同じですが、開放するポートが違います。

  • ポートの開放(ファイアウォール)
  • シャットダウンするコンピューター上で管理者権限を持っている
  • レジストリ「LocalAccountTokenFilterPolicy 」を設定をする

https://docs.microsoft.com/ja-jp/archive/blogs/jpntsblog/rpc

これらはRPC という機能になるらしいです。

つまり、ポート 135 と49152 ~65535 を開放します。

図16: Windowsファイアウォールの詳細設定で、RPC関連の受信規則(「RPC動的ポート」49152-65535、「エンドポイントマッパー」135)を確認している画面。RPC動的ポートのプロパティでローカルポートが49152-65535に設定されているのがわかる。
図16: Windowsファイアウォールの詳細設定で、RPC関連の受信規則(「RPC動的ポート」49152-65535、「エンドポイントマッパー」135)を確認している画面。RPC動的ポートのプロパティでローカルポートが49152-65535に設定されているのがわかる。

結構な開放になるので、ある程度制限を設けておかないとセキュリティ面で心配ではありますね。

あと、PowerShell のバージョンなどにも留意する必要がありそうです。

リモート コマンドの実行

できるなら、SSH 接続 からシャットダウンコマンドを実行した方がいいのかも。

参考

Windows PCをリモートシャットダウンする方法やエラー時の対処方法

リモート電源オフの導入。

スマートプラグで電源の供給自体を停止。

結局、完全にハングアップしてコマンドを受け付けてくれない時の対策として、
リモート電源プラグも導入することにしました。

消費電力もモニタリングできて〇

これならGoogle Home 等のクラウドサービスを経由して、
外部ネットワークからでも電源のオン / オフが可能になります。

最後は物理っす。IoT っす。

以上です。

(Visited 17,335 times, 2 visits today)

「Windows 系OS で、リモートシャットダウンを設定する。」への5件のフィードバック

  1. ピンバック: 他の PC からの再起動 - IwaoDev

  2. GPTに聞いても海外フォーラム見てもだめで途方に暮れていたところでしたがこちらのファイアウォールの設定で解決しました!感謝です。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です