システムエンジニアXの「プログラミング以外」の話 50代会社員SEのお仕事・副業・システム運用の経験談

【検証】タスクスケジューラ対話型トークンとS4Uバックグラウンド実行の境界線

公開:

※本記事には広告を含みます。

はじめに

WindowsのタスクスケジューラにPowerShellスクリプトやバッチファイルを登録した際、「手動で叩くと正常に動くのに、夜間の自動実行にするとなぜかフリーズして終わらない」「マップしたネットワークドライブ(Zドライブなど)が見つからないとエラーになる」と頭を抱えたことはないでしょうか。

私も過去に、業務アプリの自動操作バッチをサーバーへ移行した際、「ログアウト状態でも動くように」とセキュリティオプションを切り替えた途端、ポップアップ画面が裏側で待機状態になってタスクが3日間スタックし続けた苦い経験があります。

このトラブルの根本原因は、タスクスケジューラがプロセスを起動する際に割り当てる ログオントークンの種類(InteractiveToken / S4U / Password) と、Windowsの セッション0分離(Session 0 Isolation) の仕様にあります。

この記事では、タスクスケジューラのログオンオプションによる動作の境界線を実機検証ベースで整理し、画面表示やネットワークアクセスで失敗しない設計基準を解説します。

読み終えるころには、どのオプションを選べばバッチが確実に完走するのかを迷わず判断できるようになります。

この記事の要点

  • 画面(UI)の表示やExcel等のGUI操作を伴う処理には、「ユーザーがログオンしているときのみ実行する(InteractiveToken)」が必須
  • 「ログオンしているかどうかにかかわらず実行する」を選ぶと、プロセスは非対話型の「セッション0」で動くため、ダイアログが出ると誰も押せずに無限ハングする
  • 「パスワードを保存しない(S4U)」を有効にすると、自身のPC内しかアクセスできないトークンになり、ファイルサーバー等の共有フォルダアクセスがすべて拒否される
項目 動作確認・検証環境
検証年月 2026年9月
対象OS Windows 11 Pro 24H2 / Windows Server 2022
対象ツール Windows タスクスケジューラ / PowerShell 5.1・7.4
確認コマンド Get-ScheduledTask / New-ScheduledTaskPrincipal

結論:3つのログオンタイプ(InteractiveToken / Password / S4U)の決定的な違い

結論からお伝えすると、タスクスケジューラの「全般」タブにあるセキュリティオプションの選択によって、OS内部ではまったく異なる3種類の認証トークンと実行セッションが割り当てられます。

まずは、3つのモードの境界線を一覧表で比較します。

比較項目 ① ログオンしているときのみ実行 (InteractiveToken) ② ログオンにかかわらず実行+パスワード保存 (Password) ③ ログオンにかかわらず実行+パスワード保存しない (S4U)
PowerShellの LogonType Interactive Password S4U (Service for User)
実行されるセッション ユーザーセッション(Session 1以上) セッション0(非対話型バックグラウンド) セッション0(非対話型バックグラウンド)
画面表示(GUI・ポップアップ) 表示される(操作可能) 一切表示されない(対話待ちでハングする) 一切表示されない(対話待ちでハングする)
ネットワーク共有(UNCパス) アクセス可能 アクセス可能(資格情報あり) アクセス不可(ローカルリソースのみ)
マップドライブ(Z: 等) アクセス可能(※非昇格時のみ) 原則不可(UNCパス指定が必要) 不可
ログオフ中の自動実行 不可(ログオン中のみ起動) 可能 可能

上記の通り、「ログオンしていなくても動いてほしい」「画面も出してほしい」「パスワードは保存したくないがファイルサーバーにも繋ぎたい」という要件をすべて同時に満たす設定は、Windowsのセキュリティアーキテクチャ上存在しません。用途に応じた正しい使い分けが不可欠です。


なぜ画面が出ないのか?「セッション0分離」とInteractiveTokenの仕組み

「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを入れた瞬間、たとえ同じアカウントで現在デスクトップにサインインしていたとしても、タスクの画面は一切見えなくなります。これにはWindows Vista / Server 2008以降で導入された 「セッション0分離(Session 0 Isolation)」 が関係しています。

1. ユーザーセッション(Session 1〜)とセッション0の壁

Windows OSは、プロセスが動く空間(セッション)を厳格に分離しています。

  • セッション0(Session 0): OSのシステムサービスや、バックグラウンドタスク専用の空間です。セキュリティ保護のため、物理モニターやキーボード・マウスといった対話型デバイス(デスクトップ画面)から完全に切り離されています。
  • セッション1以上(Session 1, 2...): 実際に人間がサインインしてデスクトップを操作している空間です。

タスクスケジューラで「ユーザーがログオンしているときのみ実行する(InteractiveToken)」を選んだ場合のみ、現在サインインしているユーザーの「セッション1」のトークンを使ってプロセスが起動するため、画面上にコマンドプロンプトやアプリのウィンドウが表示されます。

2. セッション0でダイアログが出ると何が起きるか(無限待機トラブル)

一方、「ログオンしているかどうかにかかわらず実行する」を選ぶと、タスクは強制的に セッション0 で起動します。

もしセッション0で動くスクリプトの中で、msg.exe 以外のメッセージボックス表示や、認証プロンプト、あるいはExcelの「ファイルを保存しますか?」といった確認ダイアログが発生すると、「誰にも見えない裏の空間で『OK』ボタンが押されるのを永遠に待ち続ける」 という状態に陥ります。

タスクスケジューラの一覧上ではステータスが「実行中」のまま何時間も止まり、後続のスケジュールがすべてスキップされる重大な障害につながるため、バックグラウンド実行時は「いかなるエラー時もUIを出さない(サイレント実行オプションを付ける)」設計が鉄則です。


現場でハマる「バックグラウンド実行」3つの落とし穴と回避策

実務の自動化スクリプト構築において、ログオンオプション周りで特にトラブルが多発する3つの落とし穴と具体的な解決策を解説します。

落とし穴1:「パスワードを保存しない(S4U)」で共有フォルダが拒否される

セキュリティポリシー上、「タスクにパスワードを保存させたくない」という理由で「パスワードを保存しない」にチェックを入れるケースがあります。

これをオンにすると、Windowsは S4U(Service for User to Self) という仕組みを使い、パスワードなしでバッチ用のトークンを生成します。しかし、S4Uで生成されたトークンはOS内部で「ネットワーク上での本人証明(委任)ができないトークン(Network CleartextではなくBatch相当のローカル限定トークン)」として扱われます。

そのため、スクリプト内でファイルサーバー(\\fileserver\share)へアクセスしようとすると、本来アクセス権があるユーザーであっても以下のエラーで弾かれます。

アクセスが拒否されました。(0x80070005 / Access is denied)

【回避策】:
ファイルサーバーや外部ネットワークリソースへアクセスするタスクを無人実行したい場合は、「パスワードを保存しない」のチェックを外してパスワードを保存する(LogonType: Password)か、パスワード管理が不要な gMSA(グループ管理サービスアカウント) の利用へ切り替えてください。

落とし穴2:ネットワークドライブ(Z: ドライブ等)が見つからない

普段エクスプローラーで Z: ドライブとして割り当てている共有フォルダに対し、スクリプト内で Copy-Item "C:\data\log.txt" "Z:\backup\" と記述すると、タスクスケジューラ実行時に「ドライブが見つかりません」というエラーになります。

ネットワークドライブのマッピング(ドライブレター割り当て)は、PC全体ではなく 「対話型ログオンセッションごと(さらには昇格トークンと非昇格トークンごと)」に独立して管理されるローカル環境変数のようなもの だからです。

セッション0で動くバックグラウンドタスクや、「最上位の特権で実行する(管理者昇格)」にチェックを入れたタスクからは、通常ユーザーがマウントした Z: ドライブは存在しないものとして扱われます。

【回避策】:
タスクスケジューラで動かすスクリプト内では、ドライブレター(Z:\)は絶対に使用せず、必ず UNCパス(\\192.168.1.10\backup\ や \\fileserver.corp.local\backup\) で直接記述してください。

落とし穴3:Excel等のCOMオブジェクト操作がセッション0で失敗する

PowerShellやVBScriptから New-Object -ComObject Excel.Application を呼び出して帳票を作成するバッチは、対話型(InteractiveToken)では動きますが、バックグラウンド(セッション0)に切り替えると以下のエラーで異常終了します。

Microsoft Excel でファイル '<ファイルパス>' にアクセスできません。次のいずれかの理由が考えられます。
• ファイル名またはパスが存在しません。
• ファイルが他のプログラムによって使用されています。

Officeアプリケーション(ExcelやWord)は本来人間が画面上で操作する対話型アプリ(Interactive Desktop前提)として設計されており、セッション0には仮想デスクトップ用のプロファイルフォルダが存在しないため、ファイル展開に失敗します。

【回避策】:
無人バッチでExcelファイルを生成・加工する場合は、Excel本体(COMオブジェクト)を起動するのではなく、OpenXMLベースのライブラリ(PowerShellの ImportExcel モジュールなど)を使用することで、セッション0でも高速かつ確実に処理できます。


PowerShellでタスクのLogonTypeを確認・変更する実践コマンド

現在登録されているタスクがどのトークン方式(Interactive / Password / S4U)で設定されているかは、GUIを開かなくてもPowerShellで一括監査できます。

1. 既存タスクのLogonTypeを一覧確認する

管理者権限のPowerShellで以下のコマンドを実行すると、独自に作成したタスクの実行ユーザーとトークン種別を一覧表示できます。

# ルートフォルダ配下のタスクの実行アカウントとLogonTypeを確認する
Get-ScheduledTask -TaskPath "\" | Select-Object TaskName, State, @{
    Name = "UserId"; Expression = { $_.Principal.UserId }
}, @{
    Name = "LogonType"; Expression = { $_.Principal.LogonType }
}, @{
    Name = "RunLevel"; Expression = { $_.Principal.RunLevel }
} | Format-Table -AutoSize

出力の LogonType 列を見ることで、設定状態を即座に判別できます。
- Interactive: ユーザーがログオンしているときのみ実行する
- Password: ログオンにかかわらず実行する(パスワード保存あり)
- S4U: ログオンにかかわらず実行する(パスワード保存なし)
- ServiceAccount: SYSTEM や LOCAL SERVICE、NETWORK SERVICE で実行

2. PowerShellで対話型(Interactive)タスクを新規登録する例

キッティング時などにスクリプトから「対話型トークン+最上位の特権(管理者権限)」のタスクを自動登録する場合は、New-ScheduledTaskPrincipal で -LogonType Interactive を明示します。

# 対話型トークン(Interactive)かつ管理者特権(Highest)でタスクを登録するコード
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"C:\Scripts\Show-Alert.ps1`""
$trigger = New-ScheduledTaskTrigger -AtLogOn
$principal = New-ScheduledTaskPrincipal -UserId "CORP\admin_user" -LogonType Interactive -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Hours 1)

Register-ScheduledTask -TaskName "UserLogonAlertTask" -Action $action -Trigger $trigger -Principal $principal -Settings $settings

このようにコード化しておくことで、GUIでのチェックミスによる「画面が出ない」「権限が足りない」といった設定事故を確実に防げます。


よくある質問(FAQ)

Q: サーバーを再起動したあと、誰もログインしなくても画面操作(RPAやUI自動化)のタスクを動かす方法はありますか?

A: 標準のタスクスケジューラ機能だけでは不可能です。InteractiveToken は誰かがサインインしてデスクトップセッション(Session 1以上)が存在していないと起動できません。無人再起動後にGUI操作を伴うレガシーアプリやRPAを動かす必要がある場合は、閉域網の専用端末として Autologon(Sysinternalsツール等)を設定して起動時に自動サインインさせたうえで、直後に画面ロックをかける運用を組み合わせるのが現実的な回避策です。

Q: SYSTEMアカウントで実行しているタスクから、現在サインインしているユーザーの画面にポップアップ通知を出すことはできますか?

A: SYSTEMアカウントのタスク自身はセッション0で動くため直接ウィンドウを表示できませんが、Windows標準の msg.exe コマンド(例:msg * "メンテナンスを開始します")や、PowerShellから WTSSendMessage API(またはIntune等のトースト通知機構)を呼び出すことで、セッション0からセッション1のユーザー画面へ向けてメッセージを送出することは可能です。

Q: 「最上位の特権で実行する」にチェックを入れるかどうかの判断基準は?

A: スクリプト内で「イベントログ(Security等)の読み書き」「Windowsサービスの再起動」「C:\Program Files や HKLM レジストリの変更」を行う場合はチェック(RunLevel: Highest)が必須です。単なるログファイルの集計やユーザープロファイル内のファイルコピーであれば、最小権限の原則に従いチェックを外す(RunLevel: Limited)のが安全です。


まとめ

タスクスケジューラにおける対話型トークン(InteractiveToken)とバックグラウンド実行の境界線は以下の通りです。

  • 画面表示やGUIアプリ(Excel COM等)の操作が必要なら InteractiveToken(ログオン時のみ実行) を選ぶ
  • 無人・ログオフ状態で定期実行したいなら Password(ログオンにかかわらず実行) を選び、スクリプトから一切のUI表示・対話プロンプトを排除する
  • ファイルサーバー等の ネットワーク越しの共有フォルダへアクセスするなら S4U(パスワードを保存しない)は使わない
  • スクリプト内のファイルパス指定には、マウント状態に左右されるドライブレター(Z:)ではなく UNCパス(\\server\share) を徹底する

この3つのモードとセッション0分離の仕組みを理解しておけば、バッチ移行時や自動化設計での手戻りをゼロにできます。

関連記事

免責規定

この記事で提供される情報は、一般的なガイダンスを目的としており、すべての環境やシステムでの動作を保証するものではありません。

OSのバージョンやリリースによっては、記載されている事が実行できない、または異なる結果をもたらす可能性があります。 また、会社所有のパソコン、スマホ、タブレットなどでは、ポリシーや権限によって実行できない場合があります。

この記事の情報を使用することによって生じる問題や結果について、筆者およびサイト管理者は責任を負いません。 すべての操作は自己責任で行ってください。

最後までお読みいただきありがとうございました。
またお会いしましょう!

著者のおすすめ教材 & note実践記事

公式教材 豪華4大特典付き

PowerShell実務スクリプト50選

AD・Windows運用・障害対応をコマンド一発で自動化する現役SEの実務スクリプト集。

最新note 毎日定時で帰る現場ハック

ググっても出ない実務テク20選

社内SE現場の地味で細かすぎる面倒作業を一撃で解消する実践テクニック集。