タスクスケジューラでアプリを自動実行する前に、「Windows起動時」と「ユーザーのログオン時」を選び分けます。画面を持たない常駐処理や保守スクリプトは起動時、利用者が操作するGUIアプリは対象ユーザーのログオン時が基本です。起動時タスクをSYSTEMや「ユーザーがログオンしているかどうかにかかわらず」で動かしても、GUIは利用者のデスクトップへ通常表示されません。実行ファイルの公式な絶対パス、引数、作業フォルダー、実行アカウント、ネットワーク依存を確認し、最小権限で1台ずつ検証します。
起動時とログオン時の判断基準
- コンピューターの起動時:ユーザーがサインインする前から必要な、画面を持たない処理。サービス化できる製品は公式サービスを優先する
- ログオン時:ブラウザー、業務クライアント、通知ツールなど、ユーザーの画面に表示するアプリ
- 特定ユーザーのログオン時:その利用者だけが必要なアプリ。共有PCで全員へ無差別起動しない
- 任意のユーザーのログオン時:端末共通要件があり、ライセンス、同時起動、ユーザーデータ分離を確認できた場合だけ
単に利用者がサインインしたときアプリを開くだけなら、「設定」→「アプリ」→「スタートアップ」またはアプリ自身の自動起動設定の方が管理しやすい場合があります。タスクスケジューラは、遅延、条件、実行アカウント、再試行などが必要な場合に使います。ブラウザーを必ず起動させるためだけに最高権限の起動時タスクを作る必要はありません。
登録前の安全確認
- 実行ファイルをメーカー公式の場所から導入し、デジタル署名と版数を確認する
- 対象アカウントで手動起動し、必要な権限、引数、作業フォルダーを確認する
- 相対パス、利用者の一時フォルダー、ダウンロードフォルダーを実行元にしない
- スクリプトなら承認済み保管場所、変更管理、署名、ログ出力、再実行時の安全性を確認する
- ネットワーク共有やクラウドを使う場合、サインイン前に利用できるかと資格情報の扱いを確認する
- 同じ目的のサービス、スタートアップ、既存タスクがなく、二重起動しないことを確認する
既存タスクを変更する前は、タスクスケジューラで対象を選び「エクスポート」してXMLを承認済みの管理場所へ保存します。パスワードそのものはXMLへ書かれませんが、アカウント名、パス、引数などの構成情報が含まれるため公開しません。新規作成では、同名タスクを上書きせず、組織名や用途を含む一意な名前を使います。
タスクスケジューラを開く
WindowsキーとRキーを押し、taskschd.msc を実行します。一般ユーザーのログオン時に自分のアプリを動かすだけなら通常権限で登録できる場合があります。全ユーザー、起動時、管理処理、別アカウントを使うタスクは承認済みの管理者で開きます。UACや「バッチジョブとしてログオン」権限を無効化して回避しません。
右側の「基本タスクの作成」は簡単ですが、実行アカウント、遅延、再実行、重複時動作を正確に設定するには「タスクの作成」を使います。タスクスケジューラライブラリ直下を散らかさず、組織で決めたフォルダーへ作成します。
「全般」で実行コンテキストを決める
- 名前にアプリ名、対象、起動条件が分かる文字列を入れ、説明に所有者と変更番号を記録する
- GUIアプリなら対象ユーザーを選び、「ユーザーがログオンしているときのみ実行する」を使う
- バックグラウンド処理なら専用サービスアカウントまたは管理されたサービスアカウントを検討する
- 「最上位の特権で実行する」は、アプリの公式要件と承認がある場合だけ有効にする
- 「ユーザーがログオンしているかどうかにかかわらず」を選ぶ場合、非対話セッションで画面が出ないことを前提にする
- パスワードをスクリプト、引数、説明欄へ保存しない
保存時に資格情報を求められる構成では、タスクスケジューラの保護された資格情報保存を使い、共有アカウントのパスワードを手順書へ記載しません。S4Uなどパスワードを保存しないログオン方式は、ネットワークや暗号化ファイルへアクセスできない制約があります。必要なリソースに合わせてセキュリティ担当が方式を選びます。
「トリガー」を設定する
「トリガー」タブ→「新規」で、バックグラウンド処理なら「スタートアップ時」、GUIアプリなら「ログオン時」を選びます。起動直後はネットワーク、EDR、更新、ストレージが集中するため、処理が急ぎでなければ遅延を設定します。ログオン時は「特定のユーザー」を選び、共有PCの全利用者へ同じアプリが起動しないよう限定します。
複数トリガーを追加すると同じアプリが重複起動する可能性があります。起動時とログオン時を同時に設定する前に、アプリが多重起動を防げるか確認します。「繰り返し間隔」は定期処理用で、常駐アプリの再起動保証として短い間隔にしません。
「操作」で実行ファイルと引数を分ける
「操作」タブ→「新規」→「プログラムの開始」を選びます。「プログラム/スクリプト」には実行ファイルの絶対パスだけを入れ、「引数の追加」には引数だけ、「開始」に作業フォルダーを入れます。実行ファイルと引数を1つの欄へ引用符付きでまとめると、パス解析に失敗することがあります。
プログラム/スクリプト: C:\Program Files\Vendor\App\App.exe
引数の追加: --mode tray
開始: C:\Program Files\Vendor\App
上は配置例です。実在する公式パスと、そのアプリが文書化している引数だけを使います。Chromeが必ずProgram Files (x86)にあるとは限らず、32/64ビット、ユーザー単位、更新方式で場所が変わります。エクスプローラーのショートカットではなく実体パスを確認し、URL、トークン、パスワードを引数へ直接入れません。
「条件」と「設定」で暴走を防ぐ
- ネットワーク必須処理は「次のネットワーク接続が使用可能な場合のみ開始」を検討する
- ノートPCで必要な処理なら、AC電源時のみの既定値が要件と合うか確認する
- 予定時刻を逃した処理だけ「スケジュールされた時刻に開始できなかった場合、すぐにタスクを実行」を検討する
- 「タスクが既に実行中の場合」は、GUIアプリなら新しいインスタンスを開始しない設定を使う
- 失敗時再起動は、処理が再実行安全であり、回数と間隔を制限できる場合だけ設定する
- 長時間アプリを一律の短い時間で停止せず、停止要求への応答とデータ保存を確認する
保存後にテストする
対象タスクを右クリックして「実行」し、アプリまたは処理のログを確認します。GUIアプリは対象ユーザーの画面に表示されるか、バックグラウンド処理は期待する出力と終了コードになるかを確認します。次の照会で登録内容と直近の結果を読み取れます。
Get-ScheduledTask -TaskName 'Launch Vendor App' | Format-List TaskName, TaskPath, State
Get-ScheduledTaskInfo -TaskName 'Launch Vendor App' | Format-List LastRunTime, LastTaskResult, NextRunTime
schtasks /query /tn "\Organization\Launch Vendor App" /v /fo list
LastTaskResultが0でも、プロセスを起動できたことしか示さず、アプリの業務処理完了までは保証しない場合があります。アプリログ、出力ファイル、サービス状態まで確認します。その後、実際のトリガー条件で1回テストします。起動時タスクなら保守時間に再起動し、ログオン時タスクなら対象ユーザーでサインアウト・サインインします。
動かないときの確認順
- ファイルが見つからない:絶対パス、引用符、引数欄、開始フォルダー、更新後の実体パスを確認する
- アクセス拒否:実行アカウントのファイル権限と「バッチジョブとしてログオン」を確認し、SYSTEM化や最高権限で回避しない
- 画面が出ない:起動時または非対話ログオンでGUIを動かしていないか確認し、ログオン時かつログオン中のみへ変更する
- ネットワーク共有へ届かない:起動時のネットワーク準備、実行アカウント、S4U制約、UNCパスを確認する
- 手動実行だけ成功:トリガー、条件、電源、ネットワーク、実行時刻、ユーザーを比較する
- 複数起動する:重複トリガーと「既に実行中の場合」の設定を確認する
詳細はイベントビューアーの「アプリケーションとサービスログ」→「Microsoft」→「Windows」→「TaskScheduler」→「Operational」とアプリ自身のログで確認します。タスクスケジューラサービスを停止したり、履歴が取れないからセキュリティ監査を無効にしたりしません。
安全な戻し方
問題が出たら、まず対象タスク1件を「無効」にし、次回起動またはログオンで自動実行されないことを確認します。既に動いているアプリを強制終了すると未保存データを失うため、アプリの通常終了手順を使います。構成をエクスポートし、不要と承認された後でそのタスクだけを削除します。タスクスケジューラライブラリ全体、他製品のタスク、タスクスケジューラサービスを削除・無効化しません。既存タスクを変更した場合は、事前にエクスポートしたXMLと変更記録から元の設定へ戻します。
公式情報・参考資料

コメント