0

C++ でスケジューラを作成しました。すべてのパラメータを設定し、指定されたユーザー名でユーザーがログオンしている場合にのみタスクが実行されるように構成しました (TASK_FLAG_RUN_ONLY_IF_LOGGED_ON フラグを設定して実行します)。

タスクを実行しようとすると、「開始できませんでした」というステータスが表示されます。ここで、タスク プロパティの任意のプロパティを手動で編集し、[OK] をクリックすると、タスクは正常に実行されます。

注:指定された手動編集は、実行可能ファイル名またはユーザー名の末尾にスペースを追加するなど、何でもかまいません。何が問題なのですか?

以下は私が使用しているコードです:

#include <windows.h>
#include <initguid.h>
#include <ole2.h>
#include <mstask.h>
#include <msterr.h>
#include <wchar.h>
#include<stdio.h>
#include<conio.h>

#pragma comment(lib, "Mstask.lib")
#pragma comment(lib, "ole32.lib")

int main(int argc, char **argv)
{
 HRESULT hr = S_OK;
 ITaskScheduler *pITS;

 ///////////////////////////////////////////////////////////////////
 // Call CoInitialize to initialize the COM library and then
 // CoCreateInstance to get the Task Scheduler object.
 ///////////////////////////////////////////////////////////////////
 hr = CoInitialize(NULL);
 if (SUCCEEDED(hr))
 {
  hr = CoCreateInstance(CLSID_CTaskScheduler,
   NULL,
  CLSCTX_INPROC_SERVER,
   IID_ITaskScheduler,
   (void **) &pITS);
   if (FAILED(hr))
  {
   CoUninitialize();
   return 1;
   }
  }
    else
 {
  return 1;
 }

 LPCWSTR pwszTaskName;
 ITask *pITask;
  pwszTaskName = L"TestTask";

 hr = pITS->NewWorkItem(pwszTaskName,
  CLSID_CTask,
  IID_ITask,
 (IUnknown**)&pITask);

  if (FAILED(hr))
 {
  wprintf(L"Failed calling ITaskScheduler::NewWorkItem: ");
  wprintf(L"error = 0x%x\n",hr);
  CoUninitialize();
   return 1;
  }


  LPCWSTR pwszApplicationName = L"C:\\windows\\notepad.exe";

  hr = pITask->SetApplicationName(pwszApplicationName);

  if (FAILED(hr))
 {
  wprintf(L"Failed calling ITask::SetApplicationName: ");
  wprintf(L"error = 0x%x\n",hr);
  pITS->Release();
  pITask->Release();
  CoUninitialize();
  return 1;
 }

  pITask->SetAccountInformation(L"USERNAME", NULL);
  pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
  pITask->SetWorkingDirectory(L"C:\\windows");


  ITaskTrigger *pITaskTrigger;
  WORD piNewTrigger;
  hr = pITask->CreateTrigger(&piNewTrigger,
                         &pITaskTrigger);
  if (FAILED(hr))
  {
    wprintf(L"Failed calling ITask::CreatTrigger: ");
    wprintf(L"error = 0x%x\n",hr);
    pITask->Release();
    CoUninitialize();
    return 1;
  }

  pITS->AddWorkItem(pwszTaskName, pITask);
  pITS->Release(); // Release sceduler

   hr = pITask->Run();
  if (FAILED(hr))
  {
    wprintf(L"Failed calling ITask::Run, error = 0x%x\n",hr);
    pITask->Release();
   CoUninitialize();
   return 1;
  }

   pITask->Release();      
  CoUninitialize();
    _getch();
  return 0;
}
4

2 に答える 2

0

私はあなたがすべての戻り値をテストする必要があると思います、それは明らかになるかもしれません。私は主に次のことについて疑っています:

 pITask->SetAccountInformation(L"USERNAME", NULL);
 pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);

Readinig http://msdn.microsoft.com/en-us/library/aa381276(VS.85).aspx最初にSetFlagsを呼び出し、次にSetAccountInformationを呼び出す必要があるという印象を受けました。

于 2010-12-02T17:25:34.073 に答える
0

XP でも同じ問題が発生しました。ステータスが「開始できませんでした」で、手動で編集してもすべて問題ありません。解決:

  • 詳細 -> ログの表示に移動します。そして、失敗の理由を見てください。
  • 私の場合、「指定されたタスクのアカウント情報を取得しようとして失敗しました」とありました。したがって、ユーザー名を取得しGetUserNameて設定する必要がありましたSetAccountInformationSetAccountInformationとの順序はSetFlags関係ないことに注意してください。
  • その他の理由についてはこちらをご覧ください。

いつか誰かの役に立ちますように。

于 2013-08-03T06:36:14.953 に答える