Windows 11 26H1でat.exeによるスケジュール管理が失敗する場合、旧AT機能を復活させるのではなく、schtasks.exe、PowerShellのScheduledTasksモジュール、またはTask Scheduler APIへ移行するのが公式の対応方針です。
対象は、2026年7月14日公開のKB5101649を適用したWindows 11 26H1、OSビルド28000.2525以降です。この変更後は、at.exeとschedcli.dllからAT Time/ATSvcサーバーを管理できません。単純なバッチ処理ならSCHTASKS、継続的に管理するならPowerShell、製品や業務アプリへ組み込むならITaskSchedulerServiceまたはTask Scheduler 2.0 APIを選ぶと、無理なく移行できます。(マイクロソフトサポート)
Windows 11 26H1でat.exeが使えなくなる対象
KB5101649では、Windows 11 26H1のタスク スケジューラ互換性に関する変更が行われました。影響を受ける条件は次のとおりです。
| 確認項目 | 内容 |
|---|---|
| 対象OS | Windows 11 Version 26H1 |
| 対象ビルド | OSビルド28000.2525以降 |
| 関連更新 | KB5101649および変更を含む後続の累積更新 |
| 影響する識別子 | at.exe、schedcli.dll、AT Time、ATSvc |
| 公式の移行先 | schtasks.exe、PowerShell ScheduledTasks、ITaskSchedulerService |
| Microsoftの扱い | 既知の不具合ではなく、旧AT管理機能からの移行を求める変更 |
MicrosoftはATServerの利用停止を推奨しており、at.exeとATServerは将来削除される可能性があると案内しています。そのため、更新プログラムのアンインストールやATSvcの再有効化を恒久的な対策にするのは適切ではありません。(マイクロソフトサポート)
「既存のATタスクがすべて停止する」とは限らない
今回明記されているのは、at.exeとschedcli.dllからAT Time/ATSvcサーバーを管理できなくなることです。
そのため、次の二つは分けて確認する必要があります。
atコマンドによる登録、一覧表示、変更、削除ができるか- すでに登録されているジョブが予定時刻に実行されるか
既存ジョブが一時的に動いていたとしても、管理手段を失った状態では障害対応や設定変更ができません。稼働確認だけで済ませず、早めに現行のタスク スケジューラへ移行する必要があります。
最初に対象ビルドとAT依存を確認する
移行作業では、いきなり新しいタスクを作るのではなく、次の順序で現状を確認します。
- Windows 11 26H1の対象ビルドか確認する
- バッチやスクリプト内の
at.exe呼び出しを探す - 既存のATタスクを記録する
- 実行ユーザー、時刻、引数、作業フォルダーを整理する
OSビルドをPowerShellで確認する
winverでも確認できますが、多数のPCを調査するときはPowerShellの方が効率的です。
$cv = Get-ItemProperty `
'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
$build = [version](
'{0}.{1}' -f $cv.CurrentBuildNumber, $cv.UBR
)
[pscustomobject]@{
ProductName = $cv.ProductName
DisplayVersion = $cv.DisplayVersion
Build = $build
Affected = (
$cv.DisplayVersion -eq '26H1' -and
$build -ge [version]'28000.2525'
)
}
AffectedがTrueなら、今回の変更対象としてAT依存を調査します。
KB番号だけで判定すると、後続の累積更新に置き換わった端末を見落とすことがあります。運用では、KB番号よりもOSバージョンとビルド番号を基準にする方が確実です。
バッチやスクリプトからAT依存を検索する
AT管理機能は、管理者が直接入力しているとは限りません。古いバッチ、ログオンスクリプト、資産管理ツール、セットアッププログラムから呼び出されている場合があります。
検索対象のフォルダーを指定して、at.exe、schedcli.dll、ATSvcを探します。
$roots = @(
'C:\Ops',
'C:\Scripts'
)
Get-ChildItem `
-Path $roots `
-Recurse `
-File `
-Include *.bat,*.cmd,*.ps1,*.vbs,*.js,*.xml,*.ini,*.config `
-ErrorAction SilentlyContinue |
Select-String `
-Pattern '(?i)\bat(?:\.exe)?\s+|schedcli\.dll|ATSvc' |
Select-Object Path, LineNumber, Line
C:\全体を無条件に検索すると時間がかかり、誤検出も増えます。まずは運用スクリプト、配布パッケージ、ログオンスクリプトなど、実際にジョブ登録へ使っている場所を対象にしてください。
既存タスクを退避する
更新前の端末が残っている場合は、ATジョブの一覧をテキストとして保存します。
at > C:\Temp\at-before.txt
現行のタスク スケジューラ側も保存しておきます。
schtasks /query /fo CSV /v > C:\Temp\scheduled-tasks.csv
ATで作成されたタスクには、at3478のような名前が付くことがあります。PowerShellでは、次のように候補を抽出できます。
Get-ScheduledTask |
Where-Object TaskName -Match '^at\d+$' |
Select-Object TaskPath, TaskName, State
ただし、タスク名だけでAT由来と断定してはいけません。ATで作成したタスクをタスク スケジューラ側から編集すると、通常のスケジュールタスクへ変換され、ATから見えなくなることがあります。元の運用資料やスクリプトとも照合してください。(Microsoft Learn)
schtasks、PowerShell、APIのどれへ移行するか
置き換え先は、タスクの複雑さと管理方法で選びます。
| 移行先 | 適しているケース | 主な利点 | 注意点 |
|---|---|---|---|
schtasks.exe | 単純な日次・週次・一回限りのバッチ | コマンドプロンプトや既存BATへ組み込みやすい | 引用符、日付形式、実行ユーザーの指定を間違えやすい |
| PowerShell ScheduledTasks | 複数PCへの展開、構成管理、複雑な条件 | オブジェクトとして設定でき、再実行可能な移行スクリプトを作りやすい | トリガー、アクション、設定を明示的に組み立てる必要がある |
ITaskSchedulerService/Task Scheduler 2.0 | 業務アプリ、エージェント、管理製品への組み込み | XML定義やAPIでタスクを一元管理できる | 開発、認証、RPC、エラー処理の設計が必要 |
管理者が数件のバッチを置き換えるなら、まずSCHTASKSかPowerShellを選びます。API移行が必要なのは、schedcli.dllを直接利用する製品や、独自のスケジュール管理画面を持つアプリケーションが中心です。
at.exeからschtasks.exeへ移行する
schtasks.exeは、Windows標準のタスク スケジューラをコマンドラインから管理するツールです。タスクの作成、照会、変更、実行、削除に対応しています。(Microsoft Learn)
ATコマンドとSCHTASKSの対応
| ATで行っていた操作 | 移行後の考え方 |
|---|---|
atで一覧表示 | schtasks /query /fo LIST /v |
| 時刻を指定して一度だけ実行 | /sc ONCEと/stを使用 |
| 毎日実行 | /sc DAILYを使用 |
| 曜日指定 | /sc WEEKLY /d MON,TUE,...を使用 |
| AT番号で削除 | 分かりやすいタスク名を付け、/tnで削除 |
at \\PC001でリモート管理 | /s PC001を使用 |
/interactive | 必要に応じて/itを使用。ただし完全な互換ではない |
/next:M | 次の月曜日の日付を計算し、一回限りのタスクとして登録 |
ATではタスクを数値IDで管理していましたが、SCHTASKSではCompany-NightlyBackupのような意味のある名前を付けます。障害調査や引き継ぎを考えると、用途、システム名、処理名が分かる命名にするのが実用的です。
毎日2時にバッチを実行する例
次の例では、C:\Scripts\backup.cmdを毎日午前2時にSYSTEM権限で実行します。
schtasks /create ^
/tn "Company-NightlyBackup" ^
/tr "C:\Scripts\backup.cmd" ^
/sc DAILY ^
/st 02:00 ^
/ru SYSTEM ^
/rl HIGHEST ^
/f
主なオプションの意味は次のとおりです。
| オプション | 意味 |
|---|---|
/tn | タスク名 |
/tr | 実行するプログラム、コマンド、バッチ |
/sc DAILY | 毎日実行 |
/st 02:00 | 開始時刻 |
/ru SYSTEM | SYSTEMアカウントで実行 |
/rl HIGHEST | 最上位の権限で実行 |
/f | 同名タスクがある場合に上書き |
/fは既存タスクを確認なしで上書きします。本番環境では、既存タスクの設定をエクスポートしてから使用してください。
作成後は、予定時刻を待たずに手動実行できます。
schtasks /run /tn "Company-NightlyBackup"
実行完了後、詳細を確認します。
schtasks /query ^
/tn "Company-NightlyBackup" ^
/v ^
/fo LIST
/runは登録済みの実行プログラム、アカウント、資格情報を使って即時実行しますが、次回の予定実行時刻は変更しません。(Microsoft Learn)
平日のみ実行する例
ATで平日の曜日を列挙していた処理は、週次スケジュールとして移行します。
schtasks /create ^
/tn "Company-WeekdayImport" ^
/tr "C:\Scripts\import.cmd" ^
/sc WEEKLY ^
/d MON,TUE,WED,THU,FRI ^
/st 02:00 ^
/ru SYSTEM ^
/f
曜日はMON、TUE、WED、THU、FRI、SAT、SUNで指定します。
リモートPCへ登録する例
PC001へタスクを作成する場合は、/sで接続先を指定します。
schtasks /create ^
/s PC001 ^
/u CONTOSO\Admin ^
/tn "Company-NightlyBackup" ^
/tr "C:\Scripts\backup.cmd" ^
/sc DAILY ^
/st 02:00 ^
/ru SYSTEM ^
/f
この例では、/uがPC001を管理するための接続ユーザー、/ruが登録されたタスクを実行するユーザーです。両者を混同すると、管理接続には成功しても、タスクが意図しないアカウントで動作します。
また、リモート登録時のC:\Scripts\backup.cmdは、操作しているPCではなくPC001上のパスです。対象PCにファイルが存在することを確認してください。SCHTASKSは、指定したプログラムのパスやパスワードが正しいかを作成時に完全には検証しないため、「タスクの作成に成功したが実行できない」という状態が起こり得ます。(Microsoft Learn)
/v1は使用しない
schtasks /createには、古いタスク形式を作成する/v1オプションがあります。しかし、今回の目的はAT互換機能からの脱却です。
次のような指定は避けてください。
schtasks /create /v1 ...
古い互換形式へ寄せるのではなく、現在のタスク スケジューラ形式で作り直すことが重要です。
PowerShell ScheduledTasksへ移行する
PowerShellのScheduledTasksモジュールを使うと、アクション、トリガー、実行条件を個別のオブジェクトとして定義できます。多数の端末へ同じ設定を配布する場合や、同名タスクを更新し続ける運用に適しています。(Microsoft Learn)
毎日2時にSYSTEMで実行する例
$taskName = 'Company-NightlyBackup'
$action = New-ScheduledTaskAction `
-Execute "$env:SystemRoot\System32\cmd.exe" `
-Argument '/c "C:\Scripts\backup.cmd"' `
-WorkingDirectory 'C:\Scripts'
$trigger = New-ScheduledTaskTrigger `
-Daily `
-At '02:00'
$settings = New-ScheduledTaskSettingsSet `
-StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Hours 2) `
-MultipleInstances IgnoreNew
Register-ScheduledTask `
-TaskName $taskName `
-Description '毎日2時にバックアップ処理を実行する' `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-User 'SYSTEM' `
-RunLevel Highest `
-Force
この例では、次の点を明示しています。
cmd.exe /cを使い、バッチファイルを実行する- 作業フォルダーを
C:\Scriptsに固定する - 起動時刻を逃した場合は、次に実行可能になった時点で開始する
- 2時間を超えた処理を終了対象にする
- 前回処理が残っているときは新しいインスタンスを起動しない
ExecutionTimeLimitは、対象ジョブの通常の処理時間に合わせて変更してください。2時間かかる可能性がある処理に30分を設定すると、正常な処理まで途中終了します。PowerShellでは、実行時間、重複実行、再試行、ネットワーク条件などを明示的に設定できます。(Microsoft Learn)
手動実行と結果確認
Start-ScheduledTask -TaskName $taskName
処理が完了した後、直近の実行結果と次回実行時刻を確認します。
Get-ScheduledTaskInfo -TaskName $taskName |
Select-Object `
LastRunTime,
LastTaskResult,
NextRunTime
Start-ScheduledTaskはタスクの開始を要求した後、処理完了を待たずに制御を戻します。実行直後ではなく、ジョブが終了してからLastTaskResultとアプリケーション側のログを確認してください。(Microsoft Learn)
ATの/nextをPowerShellで置き換える
ATの/next:Mのような「次の指定曜日に一度だけ実行する」処理は、実際の日時を計算して-Onceへ渡します。
次の例は、次の月曜日の23時30分を求めます。
$now = Get-Date
$targetDay = [DayOfWeek]::Monday
$days = (
([int]$targetDay - [int]$now.DayOfWeek + 7) % 7
)
$runAt = $now.Date
$runAt = $runAt.AddDays($days)
$runAt = $runAt.AddHours(23)
$runAt = $runAt.AddMinutes(30)
if ($runAt -le $now) {
$runAt = $runAt.AddDays(7)
}
$trigger = New-ScheduledTaskTrigger `
-Once `
-At $runAt
この方法なら、端末の地域設定によって解釈が変わりやすい日付文字列を、SCHTASKS /sdへ直接渡さずに済みます。
-Compatibility Atは指定しない
New-ScheduledTaskSettingsSetには互換性レベルを指定する-Compatibilityがありますが、移行先で次のように指定してはいけません。
New-ScheduledTaskSettingsSet -Compatibility At
AT互換から離れることが目的なので、通常は-Compatibilityを省略し、現行のタスク スケジューラで登録します。古いOSとの互換性が必要な場合も、対象OSと管理要件を確認したうえで、現代的な互換レベルを選択してください。(Microsoft Learn)
アプリケーションはITaskSchedulerServiceへ移行する
KB5101649では、開発者向けの移行先としてITaskSchedulerServiceが挙げられています。
ITaskSchedulerServiceは、XML形式のタスク定義を使ってスケジュールタスクを管理する、Task Scheduler Remoting ProtocolのRPCインターフェースです。管理製品やエージェントからリモートのタスクを登録、照会、実行する場合に関係します。(Microsoft Learn)
一方、WindowsアプリケーションからCOM APIを利用する場合は、Task Scheduler 2.0の次のインターフェースを中心に設計します。
ITaskServiceITaskFolderITaskDefinitionIRegisteredTask
通常はITaskService::Connectでタスク スケジューラへ接続し、フォルダーを取得してタスク定義を登録します。古いITaskSchedulerインターフェースやschedcli.dllへの依存を、そのまま別の旧APIへ置き換えるのではなく、Task Scheduler 2.0へ移行することが重要です。(Microsoft Learn)
管理ツールや業務アプリの移行では、少なくとも次の項目を設計し直します。
- タスク定義をXMLまたはTask Scheduler 2.0オブジェクトで作成する
- 数値のATジョブIDではなく、固定のタスク名とタスクパスを使用する
- 接続認証とタスク実行アカウントを分離する
- 登録、更新、実行、削除のエラーを個別に処理する
- タスクの実行結果を監視できるようにする
schedcli.dllとATSvcへの依存をビルド成果物から除去する
移行で失敗しやすいポイント
実行ファイルのパスだけでなく作業フォルダーも確認する
ATで実行されるコマンドのカレントディレクトリは、基本的にWindowsのシステムディレクトリでした。スクリプトが相対パスを使っていると、移行後に異なる場所のファイルを参照する可能性があります。(Microsoft Learn)
例えば、次のような記述は作業フォルダーに依存します。
copy data.csv backup\data.csv
次のように絶対パスへ変更する方が安全です。
copy C:\Batch\data.csv C:\Batch\backup\data.csv
PowerShellでは、New-ScheduledTaskActionの-WorkingDirectoryも明示してください。
ネットワークドライブのドライブ文字を使わない
ログオン中のユーザーが使えるZ:ドライブは、SYSTEMやサービスアカウントから見えないことがあります。
Z:\Export\result.csv
ではなく、UNCパスを使用します。
\\fileserver\Export\result.csv
ただし、SYSTEMアカウントは別PCの共有フォルダーへ、意図した権限でアクセスできるとは限りません。ネットワークアクセスが必要なら、専用の実行アカウントと共有アクセス権を設計してください。ATでも、リダイレクトされたドライブではなくUNCパスの利用が推奨されていました。(Microsoft Learn)
/interactiveをそのまま置き換えない
ATの/interactiveは、ログオン中ユーザーのデスクトップと対話する古い仕組みです。SCHTASKSには/itがありますが、SYSTEMで動作するタスクからユーザーへ画面を表示する用途には向きません。
次のような処理は、非対話型へ作り直します。
- メッセージボックスを表示する
- ユーザーの入力を待つ
- デスクトップアプリを自動操作する
- 確認ダイアログで処理を停止する
処理結果は、ログファイル、イベントログ、メール通知、監視システムなどへ出力する構成が適しています。SYSTEMアカウントには対話型ログオンがなく、ユーザーから画面を確認できない点にも注意が必要です。(Microsoft Learn)
タスク作成成功だけで判断しない
タスク スケジューラへの登録に成功しても、実行成功を意味しません。次の問題は、予定時刻になって初めて発覚しやすいものです。
| 問題 | 確認事項 |
|---|---|
| ファイルが見つからない | 実行ファイル、引数、作業フォルダー |
| アクセス拒否 | 実行アカウント、フォルダー権限、共有権限 |
| 認証エラー | 保存した資格情報、パスワード変更、有効期限 |
| 二重実行 | 旧ATタスクの残存、重複起動時の動作 |
| 途中終了 | 実行時間制限、スクリプトの終了コード |
| 実行されない | 開始境界、曜日、タイムゾーン、端末のスリープ |
| 画面が表示されない | SYSTEM実行、非対話セッション |
移行時は、手動実行と予定時刻での実行を両方確認してください。
日付形式を固定値で決めつけない
SCHTASKSの/sdや/edで使用する日付形式は、端末の地域設定によって異なる場合があります。日本語環境だけで動かすバッチを、そのまま海外拠点や英語OSへ配布すると、開始日が正しく解釈されない可能性があります。(Microsoft Learn)
複数の言語環境へ配布する場合は、PowerShellでDateTimeオブジェクトを作り、New-ScheduledTaskTrigger -Once -Atへ渡す方法が安全です。
26H1への更新前後で安全に切り替える手順
旧タスクの仕様を記録する
最低限、次の情報を記録します。
- 実行コマンド
- 引数
- 実行時刻と曜日
- 一回限りか繰り返しか
- 実行ユーザー
- 管理者権限の要否
- 作業フォルダー
- ネットワークパス
- 通常の処理時間
- 異常時の終了コード
- ログの保存先
- 前回処理が残っている場合の動作
ATコマンドの文字列だけを移植すると、実行ユーザーや作業フォルダーなどの暗黙条件を見落とします。
新しいタスクを別名で登録する
最初から旧タスクと同じ名前にせず、移行確認用の名前で作成します。
例:
Company-NightlyBackup-MigrationTest
手動実行して、出力ファイル、ログ、終了コード、アクセス権を確認します。
予定時刻で一度動作確認する
手動実行では成功しても、予定実行では資格情報、スリープ、ネットワーク接続などの違いで失敗する場合があります。
少なくとも一度は実際のトリガーから起動し、次を確認してください。
- 正しい時刻に開始したか
- 想定したアカウントで動作したか
- 処理が最後まで完了したか
- 次回実行時刻が正しいか
- ログや監視通知が残ったか
旧ATタスクとの二重起動を防ぐ
新しいタスクの動作確認後は、タスク スケジューラ、SCHTASKS、PowerShellのいずれかで旧タスクを特定し、無効化または削除します。
Get-ScheduledTask |
Where-Object TaskName -Match '^at\d+$'
AT由来と判断できたタスクは、業務影響を確認してから停止します。
Disable-ScheduledTask -TaskName 'at3478'
タスク名だけで機械的に削除せず、アクション、実行時刻、実行ユーザーを確認してください。
ATを呼び出す元の処理も修正する
登録済みタスクを置き換えても、端末セットアップや定期配布のたびにat.exeが再実行される構成では、エラーが繰り返されます。
次の場所も確認します。
- ソフトウェア配布パッケージ
- 初期構築用バッチ
- グループポリシーのスクリプト
- ログオン、ログオフスクリプト
- 資産管理ツールの配布ジョブ
- サーバー構築手順書
- アプリケーションのインストーラー
- ソースコード内の
schedcli.dll参照
26H1でat.exeが失敗したときに取るべき対応
Windows 11 26H1のOSビルド28000.2525以降でat.exeによるATスケジュール管理が失敗する場合、基本方針は次のとおりです。
- 単純なバッチ登録は
SCHTASKSへ移行する - 継続的な構成管理はPowerShell ScheduledTasksへ移行する
- アプリケーション組み込みは
ITaskSchedulerServiceまたはTask Scheduler 2.0へ移行する /v1や-Compatibility Atで旧形式を延命しない- 実行ユーザー、作業フォルダー、ネットワークパスを明示する
- 手動実行だけでなく、実際の予定時刻でも確認する
- 旧タスクと新タスクの二重起動を防止する
at.exe、schedcli.dll、ATSvcを呼び出す元の処理まで修正する
まず対象端末でOSビルドを確認し、運用スクリプトからat.exe、schedcli.dll、ATSvcの参照を検索してください。そのうえで、影響の大きいリモート登録処理や日次バッチから順に、名前付きの現行タスクへ置き換えるのが安全です。

コメント