PowerShell とタスクスケジューラで自動サインアウト

はじめに

リモートワークの増加に伴い、自宅からリモートデスクトップを介してコンピューターに接続して作業を行う方々が増えてきています。作業の終わりにサインアウトすることは、日々のルーチンの一部となっていることでしょう。しかし、遅くまでの作業が続くと、時折、サインアウトを忘れてしまうことがあります。これはセキュリティリスクをもたらすだけでなく、パソコンのパフォーマンスにも影響を及ぼす可能性があります。
そこで今回は、Windows PowerShell スクリプトとタスクスケジューラを使った自動サインアウトシステムをご紹介します。
具体的には、指定した時間に「1分後にサインアウトします」というメッセージが自動的に表示され、ユーザーが OK を選択するとシステムがサインアウトします。

PowerShell スクリプト

以下にスクリプトの全体像を示します:

# ----------------------------------------------------------------------------
# Author: tomo
# Creation Date: 2023-06-24
#
# This script is free to use and modify at your own discretion.
# No warranty is provided for the script's functionality.
# Use this script at your own risk.
# ----------------------------------------------------------------------------
Add-Type -AssemblyName PresentationFramework

# 引数でメッセージボックスのメッセージとタイトルを指定
function Show-MessageBox ($message, $title)
{
    [System.Windows.MessageBoxButton] $button = 'OKCancel'
    [System.Windows.MessageBoxImage] $image = 'Warning'

    # MessageBox.Showメソッドを使用してメッセージボックスを表示
    $result = [System.Windows.MessageBox]::Show($message, $title, $button, $image)

    return $result
}

# タイトルとメッセージを指定してメッセージボックスを表示
$message = '1分後にサインアウトします。よろしいですか?'
$title = 'サインアウトのお知らせ'
$result = Show-MessageBox -message $message -title $title

# OKボタンが押されたら1分後にサインアウト
if ($result -eq 'OK')
{
    Start-Sleep -Seconds 60
    shutdown.exe /l
}

タスクスケジューラに登録

次に、この PowerShell スクリプトを Windows タスクスケジューラに登録する手順について説明します。

  1. 「スタートメニュー」から「タスクスケジューラ」を開きます。
  2. 「アクション」メニューから「基本タスクの作成」を選択します。
  3. タスク名と説明を入力し、「次へ」をクリックします。
  4. 「トリガー」の設定画面で「毎日」を選択し、「次へ」をクリックします。
  5. 「毎日」の設定画面で開始日と開始時間を設定し、「次へ」をクリックします。
  6. 「操作」の設定画面で「プログラムの開始」を選択し、「次へ」をクリックします。
  7. 「プログラム/スクリプトの開始」の設定画面で、「プログラム/スクリプト」の欄に “powershell”、そして「引数の追加(オプション)」の欄に以下を入力します:
    • -ExecutionPolicy Bypass -File "スクリプトのフルパス"
  8. 「次へ」をクリックし、設定を確認した後、「完了」をクリックします。

これらの手順を行うことで、指定した時間に自動的に PowerShell スクリプトが実行され、ユーザーに「1分後にサインアウトします。よろしいですか?」というメッセージが表示されます。

スクリプトの詳細解説

スクリプトの主要な部分は、メッセージボックスを表示するための関数と、サインアウト処理を実行するための条件分岐です。

# 引数でメッセージボックスのメッセージとタイトルを指定
function Show-MessageBox ($message, $title)
{
    [System.Windows.MessageBoxButton] $button = 'OKCancel'
    [System.Windows.MessageBoxImage] $image = 'Warning'

    # MessageBox.Showメソッドを使用してメッセージボックスを表示
    $result = [System.Windows.MessageBox]::Show($message, $title, $button, $image)

    return $result
}

この部分はメッセージボックスを表示するための関数 Show-MessageBox を定義しています。引数として $message$title を取り、これらをメッセージボックスのメッセージとタイトルとして設定します。

ボタンは ‘OKCancel’ を指定しており、’OK’ と ‘Cancel’ の2つのボタンが表示されます。メッセージボックスのアイコンは ‘Warning’ を指定しています。

[System.Windows.MessageBox]::Show($message, $title, $button, $image) でメッセージボックスを表示し、ユーザーからの応答を $result に保存します。

次に、サインアウト処理を行う部分の説明に移ります。

# OKボタンが押されたら1分後にサインアウト
if ($result -eq 'OK')
{
    Start-Sleep -Seconds 60
    shutdown.exe /l
}

この部分では、ユーザーがメッセージボックスで ‘OK’ ボタンを押した場合にサインアウト処理を行います。まず、 Start-Sleep -Seconds 60 で 1 分間待機します。その後、 shutdown.exe /l を実行してサインアウトします。

これらの部分がスクリプトの主要な要素です。スクリプト全体を通じて、特定の時間にこのスクリプトが実行されると、ユーザーにメッセージボックスが表示され、ユーザーが ‘OK’ を選択した場合に 1 分後にサインアウトするという処理が行われます。

以上