Планировщик задач, созданный в C ++, не может быть запущен - PullRequest
0 голосов
/ 30 ноября 2010

Я создал планировщик в C ++. Я установил все параметры, и задача настроена на выполнение только тогда, когда пользователь вошел в систему с предоставленным именем пользователя (выполняется путем установки флага TASK_FLAG_RUN_ONLY_IF_LOGGED_ON).

Когда я пытаюсь запустить задачу, я получаю статус «Не удалось запустить».Теперь предположим, что я вручную редактирую любое свойство в свойстве задачи и нажимаю кнопку ОК, задача выполняется нормально.

Примечание. Указанное ручное редактирование может быть любым, например, добавление пробела в конце имени или имени пользователя.В чем может быть проблема?

Ниже код, который я использую:

#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;
}

Ответы [ 2 ]

0 голосов
/ 03 августа 2013

У меня была такая же проблема на XP: статус «Не удалось запустить» и все нормально после ручного редактирования.Решение:

  • Перейдите в Advanced -> View Log.И посмотрите причину сбоя.
  • В моем случае была «Попытка получить данные учетной записи для указанной задачи не удалась».Поэтому мне просто нужно было получить имя пользователя через GetUserName и установить его через SetAccountInformation.Порядок SetAccountInformation и SetFlags не имеет значения.
  • Посмотрите здесь по другим причинам.

Может быть, это кому-нибудь поможеткогда-нибудь.

0 голосов
/ 02 декабря 2010

Я думаю, вам нужно проверить все возвращаемые значения, которые могут показывать.Я в основном с подозрением отношусь к:

 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.

...