Windows TIPS
[System Environment]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

一時的にSystemアカウントでプログラムを実行する

解説をスキップして操作方法を読む

デジタルアドバンテージ 島田 広道
2009/05/22
対象OS
Windows 2000
Windows XP
Windows Server 2003
Windows Vista
Windows Server 2008
バックグラウンドで実行されるプログラムで障害が発生した場合、原因の切り分けのために、対象プログラムを手動で起動したいことがある。
しかし、特定アカウントでプログラムを起動するrunasコマンドでは、サービスなどでよく使われるSystemアカウントを指定できない。
atコマンドを利用すると、Systemアカウントでプログラムを起動できる。

解説

 タスク・マネージャの[プロセス]タブを見ると分かるように、Windowsでは多数のプログラムがバックグラウンドで実行されている。Windows標準のサービスはもとより、業務アプリケーションなどでもバックグラウンドでいくつかのプログラムを実行していることがある。こうしたプログラムで障害が発生した場合、どのように原因を追究すればよいだろうか?

 1つの方法は、手動で対象プログラムを起動してみることだ。例えば、起動に成功する場合は対象プログラムを起動する側のプログラムに、失敗する場合は対象プログラムそのものに障害がある、といったように原因の切り分けが可能だ。このとき、起動時のアカウントによって挙動が変わることがあるので、必ず障害発生時と同じアカウントで対象プログラムを起動する必要がある。

 通常のユーザー・アカウントであれば、TIPS「一時的にほかのユーザー権限でプログラムを実行する方法(runasコマンドを利用する方法)」で容易に起動アカウントは変更できる。しかしrunasコマンドには、Systemアカウントを指定してプログラムを実行できない(エラーが発生する)という弱点がある。しかも、サービスや運用管理ツールによるリモートのプログラム実行など、Systemアカウントで実行されるバックグラウンドのプログラムは多い。

サービスで使用される「System」アカウントとは?(Windows TIPS)

 このような場合はatコマンドを使えばよい。atコマンドはプログラムを特定時刻に起動するスケジュール用コマンドで、デフォルトではSystemアカウントでプログラムを起動する。これを利用して、atコマンドで対象プログラムを現在時刻の数分後に起動するようスケジュールすると、速やかに対象プログラムをSystemアカウントで起動できる。

操作方法

事前にatコマンドの起動アカウントを確認する

 本稿では、atコマンドがSystemアカウントでプログラムを起動するのを利用する。それには、あらかじめatコマンドの起動アカウントがデフォルトのSystemアカウントのままかどうか、次の手順で確認する。

  • Windows 2000/Windows XP/Windows Server 2003の場合
    コントロール・パネルの[タスク]を開いて[詳細設定]−[AT サービスのアカウント]を実行し、[システム アカウント]ラジオ・ボタンが選択されていることを確認する

  • Windows Vista/Windows Server 2008の場合
    管理ツールの[タスク スケジューラ]を開いて左ペインの[タスク スケジューラ (ローカル)]を選択後、[操作]−[AT サービスのアカウントの構成]を実行し、[システム アカウント]ラジオ・ボタンが選択されていることを確認する

 なお、Systemアカウント以外の特定アカウントが設定されていた場合は、うかつにSystemアカウントに戻さない方がよい。Systemアカウントでは何らかの不都合があって誰かに変更されたと考えられるので、既存のスケジュール・ジョブの状況などを十分に確認すること。

対象プログラムの起動をatコマンドでスケジュールする

 atコマンドで対象プログラムを起動するには、次のようにコマンドラインを入力・実行する。

at <時:分> "<プログラム名>" <コマンドライン・オプション>

 atコマンドは即座にプログラムを起動できず、<時:分>で起動時刻を指定する必要がある。そこで<時:分>には現在より数分後の時刻を指定すれば、速やかに対象プログラムを起動できる。また、<プログラム名>は必ず二重引用符(ダブル・クォート)でくくること。

ユーザー・アカウント制御(UAC)を一時的に無効にする(Windows TIPS)

 Windows Vista/Windows Server 2008の場合、UACによってコマンド・プロンプトが管理者権限で実行されていない場合、上記コマンドラインを実行しても「アクセスが拒否されました」と表示されてスケジュールに失敗する。この場合、コマンド・プロンプトのショートカットを右クリックして[管理者として実行]を実行すること。

 対象プログラムがバッチ・ファイルの場合は、次のようにcmd.exeを介して実行する。

at 12:34 "cmd.exe" /c appinst.cmd

 対象プログラムの表示(標準出力)の内容を保存するには、次のように「^>」でリダイレクト先を指定する。

at 12:34 "cmd.exe" /c appinst.cmd ^> c:\temp\stdout.log

 atコマンドによるプログラム起動のスケジュール(ジョブと呼ばれる)の状態を確認するには、オプションなしでatコマンドを実行する。

C:\temp>at
状態 ID 日付           時刻     コマンド ライン
--------------------------------------------------------------------
  1  今日           12:34    cmd.exe /c appinst.cmd
atコマンドによるスケジュール(ジョブ)の状況表示
オプションなしでatコマンドを実行すると、このようにスケジュール済みジョブのリストが表示される。
ジョブに割り当てられたID番号。ジョブの削除時にはこれを指定する。

 atコマンドのジョブを削除するには、上記のID番号と/deleteオプションを指定してatコマンドを実行する。

at 1 /delete

 あるいは前述の[タスク]または[タスク スケジューラ]のジョブ一覧から、「At」で始まる名前の該当ジョブを削除してもよい。

対話的操作を要するプログラムは要注意

 テストやデバッグのために、対象プログラムの実行中に対話的操作で動作を確認したいことはよくある。しかし残念ながら、atコマンドによる実行では以下のように対話的操作が制限される。

 デフォルトでatコマンドは、バックグラウンドでプログラムを実行し、そのUIを画面に表示させない。そのため、対話的操作を要するプログラムをatコマンドでスケジュールすると、起動してもそのUIは画面に表示されず操作できない。

 atコマンドのヘルプなどには、/interactiveオプションを指定すると対話的操作が可能になるとある。筆者が試した限り、Windows 2000 ProfessionalとWindows XPでは確かに次のコマンドラインでコマンド・プロンプトが画面に表示され、コマンド入力が可能な状態になった。

at 12:34 /interactive "cmd.exe"

タスク・スケジューラをコマンド・プロンプトから制御する(Windows TIPS)

 しかしWindows 2000 Server/Windows Server 2003/Windows Vista/Windows 2008では、/interactiveを指定しても対話的操作を要するプログラムは画面に表示されなかった。atコマンドの強化版であるschtasksコマンドでも、Systemアカウントで起動する場合に限っては対話的操作が許可されなかった。

 ちなみに、UIが表示されず対話的操作で終了できなくなったプログラムについては、前述の[タスク]または[タスク スケジューラ]のジョブ一覧から「At」で始まる名前の該当ジョブを探し、右クリックして[タスクの終了]を選べば終了できる。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間