Windows 11 26H1でat.exeが使えないときの移行手順|schtasks・PowerShell対応

Windows 11 26H1でat.exeによるスケジュール管理が失敗する場合、旧AT機能を復活させるのではなく、schtasks.exe、PowerShellのScheduledTasksモジュール、またはTask Scheduler APIへ移行するのが公式の対応方針です。

対象は、2026年7月14日公開のKB5101649を適用したWindows 11 26H1、OSビルド28000.2525以降です。この変更後は、at.exeschedcli.dllからAT Time/ATSvcサーバーを管理できません。単純なバッチ処理ならSCHTASKS、継続的に管理するならPowerShell、製品や業務アプリへ組み込むならITaskSchedulerServiceまたはTask Scheduler 2.0 APIを選ぶと、無理なく移行できます。(マイクロソフトサポート)

目次

Windows 11 26H1でat.exeが使えなくなる対象

KB5101649では、Windows 11 26H1のタスク スケジューラ互換性に関する変更が行われました。影響を受ける条件は次のとおりです。

確認項目内容
対象OSWindows 11 Version 26H1
対象ビルドOSビルド28000.2525以降
関連更新KB5101649および変更を含む後続の累積更新
影響する識別子at.exeschedcli.dll、AT Time、ATSvc
公式の移行先schtasks.exe、PowerShell ScheduledTasks、ITaskSchedulerService
Microsoftの扱い既知の不具合ではなく、旧AT管理機能からの移行を求める変更

MicrosoftはATServerの利用停止を推奨しており、at.exeとATServerは将来削除される可能性があると案内しています。そのため、更新プログラムのアンインストールやATSvcの再有効化を恒久的な対策にするのは適切ではありません。(マイクロソフトサポート)

「既存のATタスクがすべて停止する」とは限らない

今回明記されているのは、at.exeschedcli.dllからAT Time/ATSvcサーバーを管理できなくなることです。

そのため、次の二つは分けて確認する必要があります。

  • atコマンドによる登録、一覧表示、変更、削除ができるか
  • すでに登録されているジョブが予定時刻に実行されるか

既存ジョブが一時的に動いていたとしても、管理手段を失った状態では障害対応や設定変更ができません。稼働確認だけで済ませず、早めに現行のタスク スケジューラへ移行する必要があります。

最初に対象ビルドとAT依存を確認する

移行作業では、いきなり新しいタスクを作るのではなく、次の順序で現状を確認します。

  1. Windows 11 26H1の対象ビルドか確認する
  2. バッチやスクリプト内のat.exe呼び出しを探す
  3. 既存のATタスクを記録する
  4. 実行ユーザー、時刻、引数、作業フォルダーを整理する

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'
    )
}

AffectedTrueなら、今回の変更対象としてAT依存を調査します。

KB番号だけで判定すると、後続の累積更新に置き換わった端末を見落とすことがあります。運用では、KB番号よりもOSバージョンとビルド番号を基準にする方が確実です。

バッチやスクリプトからAT依存を検索する

AT管理機能は、管理者が直接入力しているとは限りません。古いバッチ、ログオンスクリプト、資産管理ツール、セットアッププログラムから呼び出されている場合があります。

検索対象のフォルダーを指定して、at.exeschedcli.dllATSvcを探します。

$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 SYSTEMSYSTEMアカウントで実行
/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

曜日はMONTUEWEDTHUFRISATSUNで指定します。

リモート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

この例では、/uPC001を管理するための接続ユーザー/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の次のインターフェースを中心に設計します。

  • ITaskService
  • ITaskFolder
  • ITaskDefinition
  • IRegisteredTask

通常はITaskService::Connectでタスク スケジューラへ接続し、フォルダーを取得してタスク定義を登録します。古いITaskSchedulerインターフェースやschedcli.dllへの依存を、そのまま別の旧APIへ置き換えるのではなく、Task Scheduler 2.0へ移行することが重要です。(Microsoft Learn)

管理ツールや業務アプリの移行では、少なくとも次の項目を設計し直します。

  1. タスク定義をXMLまたはTask Scheduler 2.0オブジェクトで作成する
  2. 数値のATジョブIDではなく、固定のタスク名とタスクパスを使用する
  3. 接続認証とタスク実行アカウントを分離する
  4. 登録、更新、実行、削除のエラーを個別に処理する
  5. タスクの実行結果を監視できるようにする
  6. 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.exeschedcli.dll、ATSvcを呼び出す元の処理まで修正する

まず対象端末でOSビルドを確認し、運用スクリプトからat.exeschedcli.dll、ATSvcの参照を検索してください。そのうえで、影響の大きいリモート登録処理や日次バッチから順に、名前付きの現行タスクへ置き換えるのが安全です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次