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


12

状況

いくつかのファイルを準備し、プログラム(.exe)を実行し、そのファイルを削除するバッチスクリプトがあります。

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

セットアップ

タスクは、すべての特権が適切に設定されたWindowsサービスアカウントとして実行するように構成されています。RDP経由でログオンにこのアカウントを使用する場合は、私が実行できる.bat.exe直接の問題もなく、それでも仕事は何もしないように表示されます。プログラムは常にファイルを変更し、タイムスタンプで変更されものはタスク中に変更されないため、これは容易に観察されます。

スケジュールされたタスクログで、プロセスの開始、終了などのタスクの情報メッセージを取得します。ただし、「結果コード」は111(運がなくてGoogleに試されました。 「これはまったく無関係です)。アプリケーションログに、まったく何も表示されません。

私が疑うのは問題です

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

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


GUIについて編集する

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


更新

「ユーザーがログオンしているかどうかに関係なく実行する」ようにタスクを構成し、run with highest privilegesオプションがオフになっている場合、エラー値は2147943859です。


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

OS = Windows Server 2008 R2 SP1

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


スクリプトと「プログラム」は、オプションやパラメーターなどの入力を受け取りますか?バッチの代わりにPowerShellを使用してみましたか?.exeスクリプト内からパラメーターを使用して「プログラム」を開始する場合、入力を引数として適切に指定する必要があります。
slybloty 14年

1
別のプログラムでスケジューラを試しましたか?あるプログラムを別のプログラムに置き換えて、どのような結果が得られるかを確認してください。
slybloty 14年

2
@ out-nullタスクスケジューラがウィンドウを使用してプログラムの実行が終了したことを認識しているとは思わない。しかし、プログラムがスプラッシュスクリーン(タスクバーなど)を作成するために特定の何かを探して、それを見つけられない場合(別のデスクトップ/ウィンドウステーションで実行されるため)、それが停止する可能性があります...
2014年

1
OK。LocalSystemアカウントで実行しようとしましたか?また、SysinternalsのProcess Monitorでプロセス起動イベントを監視しようとしましたか?
ラッキールーク14年

1
@BradBouchardあなたの答えはこの特定の場合のOPの質問を解決しないかもしれませんが、それは有効な答えであり、SFへの将来の訪問者にとって役立つ可能性があります。したがって、削除しないことをお勧めします。
私は、モニカを復活させる14

回答:


6

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

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

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

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

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

権限を確認する

さらに、既に提案したように、次をチェックして、タスクの実行に使用されるアカウントが適切に許可されていることを確認します。

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

確認/試用する追加事項

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

    @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"
    
  • たとえば、.EXEを実行してみてくださいSTARTSTART "myTitle" "C:\full\path\to\my.EXE"


2

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


これは、構成ファイルをサポートするVisual Studioで開発されたカスタムコンソールアプリを実行するためのソリューションでした。
billfredtom

1

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

/programming/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-requires-a-user-to-be

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

私はこれが非常に良い解決策ではないことを知っていますが、私たちにとってはそれが唯一うまくいったことでした。私はこれがあなたのために働くかどうかわかりません...


タスクが実行されているユーザーが(RDPを介して)効果的にログオンしていると、タスクは正しく実行されません。サービスアカウントを使用してRDP経由でログオンし、タスクを手動で開始しますが、ウィンドウが表示されません。
マリオDS 14年

2
「最高の権限で実行」オプションのチェックを外しましたか?このオプションをチェックすると、権限のエベレーションが発生し(UAC)、ユーザーがログインしてもウィンドウが表示されない(ウィンドウなしの別のセッションで呼び出されて失敗する)と思います。また、「configured for」オプションを選択してみてください->「Windows Server 2003、Windows XP、またはWindows 2000」。
frupfrup 14年

それは私が今、私は私が唯一のセットのいずれかに「用に設定」することができ、エラーコード2147943859.取得「ユーザーがログオンしているかどうかの実行」を設定する場合を除いて、違いはありませんように見えるWindows Vista/Windows Server 2008かをWindows 7/Windows Server 2008 R2。違いはないようです。
マリオDS 14年

OK。最後のテスト:「簡単なタスクを作成する」の代わりに「新しいタスクを作成する」を使用して新しいタスクを作成します(実際に表示されるテキストがわかりません-私のサーバーはドイツ語ですが-私はあなたが私の意味を知っていることを願っています) 「windows Server 2003、...」を選択できると思います。その後、plsは...他のオプションでもう一度試してください
frupfrup

1

顧客のサーバーを実行している会社の人たちは、GUIプログラムはスケジュールされたタスクを介して実行されることは一切ないと言いました。

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

ここでさらに提案を評価する機会を得られなかったことを申し訳ありませんが、とにかく助けてくれてありがとう。将来、他の人の助けになることを願っています。確かにそうなると思います。


1

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


0

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

変更T:\Apps\MyProgram.exe\\MyServer\MyShare\Apps\MyProgram.exe


いいえ、プログラムはローカルC:ドライブにあります。
マリオDS 14年

0

「ユーザーがログオンしているかどうかに関係なく実行する」というタスクを構成し、最高の特権で実行するオプションのチェックを外すと、エラー値は2147943859になります。

Hexに変換された2147943859は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

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

/programming/32589381/

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.