以前から気になっていたタスクスケジューラの「ユーザセッション」と記載のあるトリガーについて、動作を確認してみることにしましたのでご報告です。
思っていた動作とちょっと違っていたので検証した意味はあると思います。
以前の話
以前にPC使用開始と終了時に自動的にバックアップを実行する設定を実施していました。
(1/2)PCの使用開始と終了時に自動的にバックアップしたい - treedown’s Report
(2/2)PCの使用開始と終了時に自動的にバックアップしたい - treedown’s Report
この時は終了時(ログオフ時)をトリガーとしたタスクスケジューラの設定ができなかったため、ログオフスクリプトの機能を利用して、終了時のバックアップジョブを実行していました。
が、他にタスクスケジューラだけで実行する方法があるんじゃないかということで、今回タスクスケジューラのトリガーを動作確認してみることにしました。
今回試してみるタスクスケジューラのトリガー
タスクスケジューラのトリガーに存在する
「ユーザセッションへの接続時」
「ユーザセッションからの切断時」
このトリガーオプションを動作確認してみようと思います。

特に、ログオフスクリプトでしか設定できなかった終了時に実行する動作を「ユーザセッションからの切断時」トリガーで実行できると、タスクスケジューラに動作設定を統一できるので有用だと思いました。
テスト環境
テスト環境は、簡単なバッチファイルを用意しました。

各バッチファイルが実行されたら、テキストファイル「testlog.txt」に記録が残るように設定したバッチファイルです。
--------------------------------------------------------------
※テストバッチファイル:test-session-start.bat
--------------------------------------------------------------
@echo off
rem ログの出力パス
set LOG=C:\temp\TestBat\testlog.txt
rem 今日の日付取得
set Today=%date:~0,4%-%date:~5,2%-%date:~8,2%
echo -------------->> %LOG%
echo %Today% %TIME% セッションがスタートした時の処理です。>> %LOG%
echo -------------->> %LOG%
:end
set LOG=
set Today=
--------------------------------------------------------------
上記のecho行だけ区別するために、test-session-EoS.batでは「セッション終了時の処理が実行されます。」というテキストになっています。
同じようにtest-LOGON.batでは「ログオン時に実行される処理です。」というテキストにして、それぞれの処理が判別できるようにしました。
これらをタスクスケジューラに設定しようとしたのですが、

「ユーザセッションへの接続時/切断時」というトリガーの設定では、以下の2種類のトリガー条件があることが分かったので、バッチファイルを追加することにしました。
test-sessionL-start.batが実行されたら、ログファイルに「(ローカルコンピュータからの)セッションがスタートした時の処理です。」のテキストが記録されるように、
test-sessionL-EoS.batが実行されたら、「(ローカルコンピュータからの)セッション終了時の処理が実行されます。」が実行されるように設定します。

この五通りのバッチファイルをそれぞれ、バッチ内のテキストに合わせてタスクスケジューラにジョブ設定していきます。
前述のtest-session-start.batを実行する「セッション開始時の実行」というジョブでは、

このように「ユーザセッションへの接続時」をトリガーとし、「リモートコンピュータからの接続」という設定にしました。
一方で、同様にtest-sessionL-start.bat「セッション(ローカルコンピュータ)の開始」というジョブでは、

このように、「ローカルコンピュータからの接続」を選択して動作に違いが出るかどうかを確認してみることにしました。
このように、「ユーザセッションからの切断時」をトリガーとしたタスクも、「リモートコンピュータからの接続」を指定したジョブと、

以下のように「ローカルコンピュータからの接続」を指定したジョブ

の二種類を作成して、それぞれ、バッチファイルを実行⇒ログファイルに記録する処理を作成しました。
最後にログオン時のトリガーであるタスクも

このように設定して、最終的にバッチファイルと同じ数だけタスクスケジューラにジョブを作成しました。

それぞれが実行されると、

testlog.txtファイルには、このように記録されます。
この状態で、RDP接続とか直接キーボードとモニタでログオンを試してみて、どの処理が実行されたかを確認してみようという試みです。
リモートデスクトップでサインインしてみる
まずはリモートデスクトップ接続で対象のPCにサインインしてみます。
おそらくユーザセッションへの接続時のジョブが実行されるはずです。
ところが、テキストファイルに記録されたのは、

タスクスケジューラのトリガーで「ログオン時」となっているジョブしか実行されませんでした。
サインアウトしましたが、ログに追記されることはなく、サインインとサインアウトではユーザセッションをトリガーとしたジョブが実行されませんでした。
直接PCのコンソールからサインインしてみる
PCのキーボードとモニタから直接サインインした場合、どんな動きになるか確認してみました。

これも、「ユーザセッションへの接続時/切断時」の「ローカルコンピュータからの接続」というオプションが効くことでジョブの実行がされるかと思ったのですが、記録されたのは「ログオン時」となっているジョブの実行しかされなかったです。
と、なると、ユーザセッションへの接続時/切断時というトリガーってどういうときに動作するんでしょう、って疑問がわいてきます。
サインイン済のPCにリモートデスクトップ接続してみる
前述のようにPCのコンソールからサインイン済みの状態なWindowsに、リモートデスクトップ接続を実行した場合、そのデスクトップセッションをRDP接続が奪っていきます。
この時に、ジョブが実行されるかどうかを確認してみました。

これを実行したところ、ログオン時のログ記録に続けて、
トリガー「ユーザセッションからの切断時」の「ローカルコンピュータからの接続」で指定していたジョブが実行された後に、
トリガー「ユーザセッションへの接続時」の「リモートコンピュータからの接続」で指定したジョブが実行されていました。
リモートデスクトップ接続済みPCにコンソールログイン
ではこの逆となる、リモートデスクトップ接続が実行されている最中のWindowsで、実機のキーボードとモニタからサインインを実施した場合、この逆のジョブ実行がされると予想されます。実行してみました。

予想通り、「ユーザセッションからの切断時」の「リモートコンピュータからの接続」で指定したジョブが実行され、
そのあとで「ユーザセッションへの接続時」の「ローカルコンピュータからの接続」がトリガーとなった指定ジョブが実行されていました。
ここでいったんログファイルをクリアして、まっさらな状態にします。
リモートデスクトップ接続から切断するとジョブが実行されるか
思っていたような動作ではなかったものの、なんとなく動きが掴めてきました。
一旦ログファイルをクリアして、次はリモートデスクトップ接続でサインインしたあと、リモートデスクトップ接続を「切断」することでジョブが実行されるかどうかを確認してみることにしました。
PCはサインアウト状態にし、ログファイルもクリアされた状態から、次にリモートデスクトップ接続を実行します。この時点でログオン時に実行されるジョブが実行されています。

この状態でリモートデスクトップ接続を切断(サインアウトではなくRDPを×で閉じる)してみました。

[×]で閉じると切断処理と認識し、「ユーザセッションからの切断時」の「リモートコンピュータからの接続」で指定したジョブが実行されます。
別ユーザでサインアウトするとどうなる?
以前に<RDP接続先でアクティブセッションを見る方法三種 - treedown’s Report>で実行した、タスクマネージャを使って、サインイン中のユーザをサインアウト(画面上はサインオフと表記)してみるとどうなるかやってみました。
ユーザがDisconnectedとなっている状態で、別ユーザでこのWindowsにサインインし、タスクマネージャからサインオフを選択してみます。

サインアウトする対象のユーザがジョブ実行のトリガとなっているユーザです。
実行してみましたが、

ジョブは実行されませんでした。あくまでもサインアウトはログオフスクリプトの実行になるので、「ユーザセッションからの切断時」と認識されないということがわかりました。
シャットダウンしてみる
PCをシャットダウンしてみました。シャットダウン時に「ユーザセッションからの切断時」のジョブが実行されるかどうかを確認するためです。

RDP接続の画面からシャットダウンしても、PCコンソールで直接シャットダウンを指定しても、結局のところ、ジョブの実行は一切ありませんでした。やはりシャットダウン=サインアウトなので、ログオフスクリプトを設定しないとジョブ実行はできないようです。
ユーザの切り替えをやってみる
コンソールログインでユーザの切り替えをやってみたところ、「ユーザセッションの接続時/切断時」のジョブが実行されました。RDP接続だけじゃなくて、コンソールセッションでもユーザの切り替えだとセッションの切り替えと認識するようです。
スタートメニューから、サインイン中のユーザをクリックして、

ユーザの切り替え(その他ユーザと表示されている他のユーザ名)をクリックして実行すると、ログには、

切り替え前のユーザのセッション終了時の処理と、切り替え後に再接続したユーザのセッション開始時の処理がタスクスケジューラ経由で実行されました。
マルチユーザのWindows環境ではユーザの切り替え時に終了と開始の処理をこの設定で実施できるようです。
まとめ
ちょっとわかりにくい動きをしたトリガー「ユーザセッションの接続時/切断時」の動きでしたが、以下のような動きをすることが分かりました。
- 既にサインインしている状態(前提条件)で、リモートデスクトップ接続を実行した場合と切断した場合のトリガーが「ユーザセッションの接続時/切断時」である。
- サインインとサインアウト時のジョブ実行はタスクスケジューラの「ログオン時」かGPOのログオフスクリプトを使わないとジョブ実行はできない。
- 既にサインインしている状態から、リモートデスクトップ接続&切断をトリガーとしたジョブ実行が「ユーザセッションの接続時/切断時」の「リモートコンピュータからの接続」である。
- (サインイン後に)リモートデスクトップ接続中のPCで、コンソール(実機のキーボードとモニタを使った)サインインを実行したときのジョブ実行は「ユーザセッションの接続時/切断時」の「ローカルコンピュータからの接続」である。
- Windowsのユーザ切り替えは「ユーザセッションの接続時/切断時」の「ローカルコンピュータからの接続」が該当する。
概ね動作は理解できたのですが、「ユーザセッションの接続時/切断時」というトリガーはかなり狭い範囲の適用のようです。
例えば、[×]ボタンでRDP接続を切断したユーザを自動的にログオフ(logoff.exeをジョブに指定)するためのジョブくらいしか使いどころが思いつかないのですが、多分RDSサーバ(RDゲートウェイ・接続ブローカー)を構築している環境向けの機能(なので通常のWindows環境ではそれほど有用じゃない動作になる)なのかなと思いました。