web-dev-qa-db-ja.com

プログラムがスケジュールされたタスクとして正しく実行されない

状況

一部のファイルを準備し、プログラム(.exe)を実行してから、上記のファイルを削除するバッチスクリプトがあります。

このタスクは1時間ごとに実行する必要があるため、スケジュールされたタスクを使用してこれを構成しようとしています。問題は、前述のプログラムがタスクから呼び出された場合(.batスクリプト経由でも、.exeを直接呼び出した場合でも)正しく実行されないことですが、警告やエラーは表示されません。ログ内のメッセージ。

セットアップ

タスクは、すべての特権が適切に設定されているWindowsサービスアカウントとして実行するように構成されています。このアカウントを使用してRDP経由でログオンする場合、.batおよび.exeを問題なく直接実行できますが、タスクは何もしないようです。これは、プログラムalwaysがファイルを変更し、変更されたonタイムスタンプがタスクを通じて変更されないため、簡単に確認できます。

スケジュールされたタスクログで、プロセスの開始、終了などの情報メッセージを取得します。ただし、「結果コード」は111です(運良くこれをGoogleに試行したところ、取得される唯一の関連付けは "ファイル名が長すぎる」、これは完全に無関係なAFAIKです)。アプリケーションログに、まったく何も表示されません。

私が疑っているのは問題です

プログラムは古い怪物で、GUIは必要ないのに操作が不要で操作後に閉じるため、GUIは必要ありませんが、何らかのスプラッシュスクリーン(実際には通常のウィンドウです)を生成します。ウィンドウが約2秒間表示されます。

このGUIの要件は、タスクの失敗と関係があると思いますが、よくわかりません。タスクを実行するユーザー(RDP経由)でログインすると、スケジュールされたタスクを開始してもウィンドウが表示されません。


GUIについて編集する

メインウィンドウなしでプログラムを起動する非常に小さなC#実行可能ファイルを作成しました(ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hiddenを使用)。この方法でも、スケジュールされたタスクはプログラムを正しく起動できませんが、戻りコードは0になりました。


更新

「ユーザーがログオンしているかどうかにかかわらず実行する」というタスクを構成し、run with highest privilegesオプションがncheckedの場合、エラー値は2147943859です。


トラブルシューティングするにはどうすればよいですか?

OS = Windows Server 2008 R2 SP1

さらに情報が必要な場合は、コメントでお知らせください。

12
MarioDS

顧客のサーバーを実行している会社の担当者は、GUIプログラムはスケジュールされたタスクを介して実行されることは決してないだろうと言っています。

彼らは、タスクスケジューリング機能も備えた監視システムを使用しています。彼らはそれを通してそれを設定しました、そしてそれはうまくいくようです。

ここでこれ以上の提案を評価する機会を得られなかったのは残念ですが、とにかく助けてくれてありがとう。将来的には他の人にも役立つことを期待しています。

1
MarioDS

あなたの問題は、タスクを実行するために使用されているアカウントの権限、またはタスクを実行しようとしたときに存在するアカウントのコンテキストに関係していると思います。

コンソールセッション要件のテスト

あなたの。EXEは、コンピューターのConsoleセッション(別名セッション0)で実行する必要がある可能性があります。これをテストするには:

  1. タスクがユーザーがログオンしたときにのみ実行するように構成します。タスクの開始時刻を2分先に指定します
  2. タスクの実行に使用したのと同じユーザーアカウントを使用してマシンにログオンします(コンソールセッションにログオンすることをお勧めします。コンソールに物理的にアクセスするか、コンソールへのアクセスを提供するリモートアクセスプログラムを使用します)。コンソールセッション、コマンドプロンプトからQWINSTAを実行し、SESSIONNAME列を確認して、>インジケーターがconsoleの横にあることを確認します。つまり、表示されるはずです。 >console)として
  3. タスクが実行されるのを待ちます

タスクが正しく実行される場合は、SCHTASKS.EXEパラメータを使用して /IT でタスクをスケジュールしてみてください。それができない場合は、サービスユーザーアカウントとして自動的にログオンし、タスクをスタートアッププログラムとして実行するようにコンピューターを構成する以外に選択肢がない場合があります。

権限を確認する

さらに、すでに提案したように、タスクの実行に使用されたアカウントに適切なアクセス許可が付与されていることを確認するには、以下を確認してください。

  1. アカウントにバッチジョブとしてログオンユーザー権利を付与します(Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignmentsのローカルグループポリシーにあります)
  2. タスクが最高の権限で実行するように構成されていることを確認します
  3. ユーザーが操作する必要のあるすべてのフォルダとファイルに対して完全なNTFSアクセス許可を持っていることを確認します。想定しないでください。代わりに、そのようなファイルの場所に移動し、Effective Permissionsにあるファイル/フォルダーのPropertiesSecurity > Advancedタブを使用して確認します

確認/試行する追加事項

  • タスクには、ネットワークリソースへのアクセスへのアクセスが必要ですか?ユーザーアカウントでlogonを実行すると、マップされたドライブなどが表示される場合がありますが、サーバーの構成によっては、タスクスケジューラから実行したときにユーザーアカウントのコンテキストに表示されない場合があります。
  • バッチファイルにログを追加します。実行するすべての行の後で、出力がログファイルに書き込まれるようにして、行き詰まっている場所を確認します。例えば:

    @echo off
    echo Line 1 >> "C:\MyLog.txt"
    "C:\My Folder\myOldProgram.exe"
    echo Line 2 >> "C:\MyLog.txt"
    DEL somefile.dat
    echo Line 3 >> "C:\MyLog.txt"
    
  • 。EXESTARTで実行してみてください(例:START "myTitle" "C:\full\path\to\my.EXE"

他の人の役に立つ場合に備えて、古い投稿に返信しています。同じ問題がありました。イベントログには、プログラムは正常に完了したと記載されていますが、コードの最初の行でさえログに書き込まれませんでした。タスクスケジューラの[開始]オプションになってしまいました。現在のディレクトリにいるときに、プログラムがコマンドラインから正常に実行されたことがわかりました。同じディレクトリにマニフェストファイルと他の依存関係があります。したがって、スケジュールされたジョブをEXEと同じディレクトリで開始するように指示すると、好ましい結果が得られる可能性があります。それが私の解決策でした。

2
Rob Wilson

多分これはあなたを助けますか?

https://stackoverflow.com/questions/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-requires-a-user-to-be

同様の問題があり、あなたの唯一の解決策は自動ログインでサーバーに特別なアカウントを作成することでした。したがって、すでにログインしているユーザーの下でタスクが実行された場合、.exeはうまく機能しました...

これは非常に良い解決策ではないことを知っていますが、私たちにとっては、それが機能した唯一のものでした。これがうまくいくかどうかはわかりません...(しかし、この回避策では、ユーザーが本当に本当にログインしているかどうかを確認する必要があります...)

1
frupfrup

Windows 2008 R2サーバーでタスクスケジューラを使用して古いVB6プログラムを起動しようとしました。アプリケーションは、バッチファイルまたはショートカットをクリックしてexeから実行されますが、タスクスケジューラからは実行されません。 C:\ program files(x86)ディレクトリのアプリケーションフォルダーに保存されているアプリケーションの構成ファイルが、c:\ programdataのアプリケーションフォルダーにコピーされたことがわかりました。スケジューラは機能しました。 cmd.exeは、別の場所の設定をタスクスケジューラが使用する場所に適用しているようです。アプリケーションに構成ファイルがある場合は、それらをc:\ programdata\applicationフォルダーに移動してみてください。

1
Kasa

たぶんこの質問への答えは、このスレッドを読んでいる誰かを助けるでしょうか?

https://stackoverflow.com/questions/32589381/

概要:Windows 2012のスケジュールされたタスクはnotタスクが設定されているアカウントについて、PATHを含む正しい環境変数を表示しますとして実行する。

私が上記のことを理解する前に、私はこれらすべてをかなり長い間読み通しました。 (これは私自身の問題であり、OPの質問と同じです。)

(最終的に!)これを知ったら、それを(stackoverflowの回答に従って)テストし、その発生を確認し、回避することは非常に簡単です。

0
MikeBeaton

スクリプトまたはプログラムでマップされたネットワークドライブを参照していますか?しばらく前に、スケジュールされたタスクが実行されないという同様の問題があり、その理由を理解できませんでした。パスをUNCパスに変更すると解決しました。

変化する T:\Apps\MyProgram.exe\\MyServer\MyShare\Apps\MyProgram.exe

0
AdamsTips

"ユーザーがログオンしているかどうかにかかわらず実行する"というタスクを構成し、[最高の特権で実行する]オプションがオフになっていると、エラー値は2147943859になります。

2147943859を16進数に変換すると800705b3になり、Googleにすばやく移動すると、「コンピューターでインストールプログラムを開始できませんでした。この操作には対話型のウィンドウステーションが必要です」と通知されます。

今、PSEXEC(Sysinternalsから)を使用せずにインタラクティブに実行する方法があるかもしれませんが、PSEXECを介して実行する方法はすでに知っているので、これを使用します。

PSExec: http://technet.Microsoft.com/en-us/sysinternals/bb897553.aspx

したがって、すべての前にpsexec.exe -i(および昇格が必要な場合は-h)を前に付けるようにアクションを変更すると、動作するはずです。

私はこれをWindows Server 2008 R2 SP1で試しました。

c:\windows\system32\cmd.exe

そしてパラメータ:

/c psexec.exe -h -i notepad.exe

タスクを手動で実行すると(スケジュールがないため)、現在のセッションで管理者特権のメモ帳が実行されます。

0
Mark Allen