Windows 7でタスクスケジューラからバッチファイルを実行しようとしています。コマンドプロンプトから実行すると、バッチファイルを正常に実行できます。
タスクスケジューラから実行して、ユーザーがログインしているときにのみ実行する場合、タスクは問題なく実行されます。ただし、ユーザーがログインしていないときに実行すると、タスクスケジューラはファイルを実行しているように見えますが、何も起こりません。
バッチファイルの内容が原因ではないことを確認するために、バッチファイルを次の行に変更しようとしました。
echo "success" >> c:\temp\test.log
そしてそれは機能しません。何か案は?最高の権限と、バッチファイルとファイルが書き込まれているフォルダーへの完全なアクセス許可を持つ管理者アカウントで実行しています。
タスクスケジューラのプロパティ。。。
Windowsから_Task Scheduler
_ジョブで Properties
(一番下のスクリーンショットを参照) 。 。
1.General
タブで、Print Screen Aに示すように、以下のオプションが選択/チェックされているかチェックされていないことを確認します
Run only when user is logged on
_Run whether user is logged on or not
_Run with the highest privileges
_2.Conditions
タブで、以下のオプションが印刷画面Bと同じように選択、オン、またはオフであることを確認します
Wake the computer to run this task
_.Actions
タブ、Edit
、およびStart in (optional)
が、バッチスクリプトが置かれている場所を指す完全パスに対して、以下の例(DO NOTで囲む)のように設定されていることを確認しますあり[〜#〜]なし[〜#〜]最後のバックスラッシュ "_\
_" Print Screen C
OK
(上記の2.)資格情報を実行するように求めるプロンプトが表示され、その資格情報がEXECUTE
が存在するバッチファイルへのアクセスを必要とするものであり、また、スクリプトを実行して実行したバッチファイルを実行するためのアクセス権も必要です。
このプロセスの静的サービス/プロキシユーザーアカウントをセットアップし、その資格情報を使用してプロセスを実行するのが最善の方法です。パスワードが強力で、無期限に設定されていることを確認する必要があります。また、EXECUTE
バッチにアクセスし、バッチスクリプトプロセスが実行しているもの、コマンドやリソースなどを実行する必要があります。それも利用します。
オプション_Run whether user is logged on or not
_のようです。タスクスケジューラから期待どおりに実行するには、オプション_Run with highest privileges
_を確認する必要があります。
エラーチェック
実際のバッチスクリプトに問題があるが、Windows タスクスケジューラは実際にそれを実行してそれを実行しますが、何らかの理由でバッチスクリプトロジックがエラーになるなどの場合、タスクスケジューラはこのレベルでこの障害を認識しない場合があります。その観点から(デフォルトではほとんどの場合)、バッチファイルを実行しているので、実行可能であり、そのためのアクセス権があれば、ジョブは正常に実行されます。
エラーチェックまたはロギングをバッチスクリプトロジックに追加して、セキュリティコンテキストの確保を含め、このレベルでキャッチ(またはトラブルシューティング)の問題を追加します。バッチスケジューラが実行するコマンド、リソースなどへの適切なアクセス権を持つバッチスケジューラがそれを実行します。
回答:Windowsでは、この特権はローカルまたはドメインセキュリティポリシーを通じて付与されます。 ローカルセキュリティポリシーを使用してこれを行うには、次の手順に従います。
- コントロールパネルで管理ツールを開き、次にローカルセキュリティポリシーを開きます。
- Security Settingsの下でLocal Policiesを開き、ser Rights Assignmentを強調表示します。
- バッチジョブとしてログオンを見つけます。 プロパティを開き、この権限を必要とするユーザーを追加します。
- 終了したら、保存変更を加えてローカルセキュリティ設定ウィンドウを閉じます。
変更はすぐに反映されます。ドメインセキュリティポリシーを変更するには、ドメインコントローラでコントロールパネルのドメインセキュリティポリシーユーティリティを使用します
スクリプトがマップされたネットワークドライブを参照しているが、それを_Run whether the user is logged on or not
_にしたい場合、このコンテキストでは、バッチプロセスが期待どおりのことを行うためのドライブマッピングが実際には存在しない可能性があります。
問題を回避するために、可能であれば、マップされたドライブ文字ではなく、UNC
パスをバッチスクリプトロジックで使用します。それ以外の場合は、バッチプロセスの最初に_PUSHD \\ServerName\ShareName
_を使用し、バッチプロセスの最後にPOPD
を使用する必要があります。バッチプロセスの最初に_Net Use X: \\ServerName\ShareName
_を使用してドライブをマップし、バッチプロセスの最後に_Net Use X: /DELETE
_を使用してドライブを切断することができます。
スケジュールされたタスクの Settings
タブおよび_Stop the task if it runs longer than:
_としてリストされているオプション。このオプションがチェックされていて、期間が実行中のスクリプトよりも短い場合、タスクスケジューラはそれを早期に強制終了するため、期待どおりの結果が得られない可能性があります。これは、万が一に備えてトラブルシューティングを行うときに確認する必要があるものです。
から Triggers
を選択すると、スケジュールされたタスクのタブ Edit
オプションは必ず_Start:
_の時刻と日付がまだ渡されていない値であることを設定してください。日付と時刻がFutureの値に設定されていることを確認してください。それ以外の場合は、ジョブが予想どおり次のスケジュールされた時刻に実行するようにスケジュールされていることに気付く場合があります。ただし、これはタスクスケジューラによって実行されず、タスクスケジューラHistory
タブにも実行されないことが示されます(実行されないため)。トリガーを編集し、将来の日付や時刻で更新するだけで、問題が発生した場合にこの問題を解決できます。
プリントスクリーン
印刷画面A
印刷画面B
印刷画面C