Windows TIPS
[System Environment] |
一時的に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アカウントで実行されるバックグラウンドのプログラムは多い。
このような場合は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コマンドは即座にプログラムを起動できず、<時:分>で起動時刻を指定する必要がある。そこで<時:分>には現在より数分後の時刻を指定すれば、速やかに対象プログラムを起動できる。また、<プログラム名>は必ず二重引用符(ダブル・クォート)でくくること。
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」で始まる名前の該当ジョブを削除してもよい。
対話的操作を要するプログラムは要注意
テストやデバッグのために、対象プログラムの実行中に対話的操作で動作を確認したいことはよくある。しかし残念ながら、atコマンドによる実行では以下のように対話的操作が制限される。
デフォルトでatコマンドは、バックグラウンドでプログラムを実行し、そのUIを画面に表示させない。そのため、対話的操作を要するプログラムをatコマンドでスケジュールすると、起動してもそのUIは画面に表示されず操作できない。
atコマンドのヘルプなどには、/interactiveオプションを指定すると対話的操作が可能になるとある。筆者が試した限り、Windows 2000 ProfessionalとWindows XPでは確かに次のコマンドラインでコマンド・プロンプトが画面に表示され、コマンド入力が可能な状態になった。
at 12:34 /interactive "cmd.exe" |
しかしWindows 2000 Server/Windows Server 2003/Windows Vista/Windows 2008では、/interactiveを指定しても対話的操作を要するプログラムは画面に表示されなかった。atコマンドの強化版であるschtasksコマンドでも、Systemアカウントで起動する場合に限っては対話的操作が許可されなかった。
ちなみに、UIが表示されず対話的操作で終了できなくなったプログラムについては、前述の[タスク]または[タスク スケジューラ]のジョブ一覧から「At」で始まる名前の該当ジョブを探し、右クリックして[タスクの終了]を選べば終了できる。
Windows Server Insider フォーラム 新着記事