見出し画像

Windowsを遠隔でシャットダウンする (タスクスケジューラーで汎用シャットダウンサービスを構築)

こんにちはRcatです。
今回はWindowsPCを遠隔でシャットダウンしていきます。
ただ、この言い方だとリモートデスクトップやシェルなどをイメージされるかもしれませんが、そういったのとは全く別の方法をとります。


概要

タイトルにもありますが、今回はタスクスケジューラーを使います。
タスクスケジューラーとはLinuxで言うsystemdみたいなことができます。
つまり、パソコンを起動した時点でバックグラウンドでプログラムを実行することができるというわけですね。
そうすればログインして操作することが前提のWindowsでも様々な外部ツールからのアクセスを受け付けることができます。

用途

例えば、次の記事で紹介した自作アシスタントにシャットダウンしてと指示すればチャットボットがサービスへアクセスし、シャットダウンすることができます。

他にも以下で紹介しているゲームサーバー管理ツールをWindows向けに改造し、パソコンのシャットダウンを行う機能の組み込みなどにも使用しようと考えています。

解説

ベース

というわけでやることは簡単シャットダウンをするためだけのサービスを作って、それに対して外部からアクセスを受け付けられるようにするだけです。

ベースとなる知識は以下の動画で解説しています。

例えば今回用意したツールはWEBサーバーなので、シャットダウン用のURLにアクセスすると、以下のようにシャットダウンボタンが出てきます。
さすがにボタンを押すだけでシャットダウンだと、誤操作やいたずらのリスクがあるので、事前に設定したキーコードがないと発動しない仕組みにしてます。

私の場合は下記URLでアクセスすることができます。
192.168.0.199:25050/shutdown
このURLに対してGETでキーコードを渡して合っている場合シャットダウンする仕組みです。

こんな感じでアクセスします。
パスワードが間違っているのでエラーと返されました。

やり方

まず、最初にシャットダウンをするためのプログラムを作成します。
今回は動画の方で紹介しているWeb工作テンプレートを使って、httpリクエストを受け付けてシャットダウンをするプログラムを書きます。
わかりやすく言えば特定のURLにアクセスするとシャットダウンするということです。

ソースコード

ソースコードがこちら。超シンプルですね。
まず何もパラメーターを指定せずにアクセスした場合はページが表示されます。あのシャットダウンボタンですね。
次にもしパラメーターが設定されている場合、つまりパスワードが送信されてきた場合は直接ここに書いてあるパスワードと比較を行います。
そこで、パスワードが一致した場合、シャットダウンコマンドを実行するという仕組みです。

flaskの基本を知っている前提でURLのイベントハンドラーだけです。分からない場合は動画の方をご視聴いただければ理解いただけると思います。

シャットダウンコマンドについて

Windowsにはシャットダウンをするためのコマンドがあります。その名も"shutdown"。

ヘルプを確認するとなんか色々出てきますが、こうすればシャットダウンできます。

shutdown /s

/sの場合はシャットダウンで、/rの場合は再起動です。

また、/tを使ってN秒後にシャットダウンするということもできます。
以下の場合、一時間後にシャットダウンがされます。
寝る前に大きなデータをダウンロードする時、おおよその完了時刻を計算し、事前にこのコマンドを仕掛けておくなんて使い方を良くしますね。

shutdown /s /t 3600
shutdown /s /t 3600

ちなみに実行時刻まで猶予がある場合は"/a"を使うことでキャンセルさせることもできます。

タスクスケジューラに登録する手順

スタートから検索します。
この時計のマークがそうです。

起動するとこんな感じのよくわかんない画面が開きます。
いきなり作成してもいいのですが、今後の整理のことも考えて、まずはフォルダを作成しましょう。

一番左側のタスクスケジューラーライブラリのフォルダのマークのところを右クリックして新規作成、好きな名前で作成しましょう。

準備ができたら右側の基本タスクの作成ボタンを押します。
手順は以下の通りです。

  • 名前の入力
    まず最初に好きな名前を入れます

  • トリガーを選択
    コンピューター起動時を設定します。

  • 操作を選択
    プログラムの起動を選択します。

  • プログラムスクリプトの参照
    ここでは先ほど作ったPythonのサーバーを起動するためのバッチファイルを作っているので、それのパスを入れています。

  • プロパティを開くにチェックを入れて完了

チェックを入れておくとプロパティが開くので、ここでユーザーがログオンしているかどうかに関わらず、実行するにチェックを入れておいてください。こうしないと遠隔で電源を入れた場合などシャットダウンできなくなります。

以下のように新しいタスクが作成されれば完了です。
この状態でコンピューターを再起動し、ログインしなくてもサーバーにアクセスできることを確認してください。

プログラムの起動について

登録の時に、プログラムを起動するためのバッチファイルを作っていると書きましたが内容は以下のようになっています。
単純に仮想環境を用いてPythonサーバーのスクリプトを起動するという内容です。
タスクスケジューラーでこのパスを渡せば起動できることがわかっています。

塗りつぶし部はDL限定

データの配布

今回作ったシャットダウンサービス用Webサーバーを以下で配布します。
利用規約に同意の上、興味のある方は是非ダウンロードしてください。

https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=Windowsタスクスケジューラサーバー

なお、動画で紹介しているテンプレートを使って必要な部分だけ書き換えたので、ソースコードの量は多いですが、使っていないコードもかなりあります。参考に色々なサービスを組み込んでもいいかもしれませんね。

情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。