windows - Forsøger at oprette en planlagt opgave at køre en gang ved hjælp af C ++, Task Scheduler 1.0 på win7

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at oprette et meget simpelt program, der vil køre Notepad efter to minutter (det er alle forenklede for at gøre et klarere spørgsmål). Jeg forsøgte at fusionere nogle af MSDNs eksempler og til min overraskelse alt sammen kompileret med succes, når du kører program en .job opgave er oprettet i C:WindowsTasks. Jeg ser ikke den nye opgave i GUI-programmet 'Task Scheduler', og det antages, at det skyldes, at 'Task Scheduler' kun viser Task Scheduler 2.0-opgaver, men jeg er ikke sikker. Problemet er, at opgaven ikke udføres. Jeg vedhæfter koden, den er lidt lang, men godt dokumenteret. [12]


Kan nogen hjælpe med at finde ud af det?
Hvis en opgave fik en fejl, når du kører, hvor er den logget?


Note 1: Jeg ved, hvordan jeg beregner starttiden ikke er ideel (og vil give defekte resultater på tider hvor minutter er >57. Som jeg sagde før er koden nedenfor en forenklet version.


Note 2: Jeg kører det på win7, og jeg antager, at den er kompatibel med Task Scheduler 1.0 API. Denne kode skal køre på både XP og win7 maskiner (og forhåbentlig på sej 8 i fremtiden)


Bemærk 3: For alle, der er modige nok til at prøve det, hvis du får fejl 0x80070050 betyder det, at der allerede findes en opgave med det pågældende navn, skal du slette filen .job eller ændre navnet.


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


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


  /////////////////////////////////////////////////////////////////
  // Call CoInitialize to initialize the COM library and then 
  // call 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;
  }


  /////////////////////////////////////////////////////////////////
  // Call ITaskScheduler::NewWorkItem to create new task.
  /////////////////////////////////////////////////////////////////
  LPCWSTR pwszTaskName;
  ITask *pITask;
  IPersistFile *pIPersistFile;
  pwszTaskName = L"Test Task";

  hr = pITS->NewWorkItem(pwszTaskName,         // Name of task
                         CLSID\_CTask,          // Class identifier 
                         IID\_ITask,            // Interface identifier
                         (IUnknown**)&pITask); // Address of task 
                                                                                                                                                                                            //  interface


  pITS->Release();                               // Release object
  if (FAILED(hr))
  {
     CoUninitialize();
     fprintf(stderr, "Failed calling NewWorkItem, error = 0x\%x
",hr);
     return 1;
  }

  /////////////////////////////////////////////////////////////////
  //Set Comment, Name, Working dir, Params
  /////////////////////////////////////////////////////////////////
  pITask->SetComment(L"This is a comment");
  pITask->SetApplicationName(L"C:\Windows\System32\notepad.exe");
  pITask->SetWorkingDirectory(L"C:\Windows\System32");
  pITask->SetParameters(L"");

  ///////////////////////////////////////////////////////////////////
  // Call ITask::CreateTrigger to create new trigger.
  ///////////////////////////////////////////////////////////////////

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

//////////////////////////////////////////////////////
  // Define TASK\_TRIGGER structure. Note that wBeginDay,
  // wBeginMonth, and wBeginYear must be set to a valid 
  // day, month, and year respectively.
  //////////////////////////////////////////////////////

  TASK\_TRIGGER pTrigger;
  ZeroMemory(&pTrigger, sizeof (TASK\_TRIGGER));

  LPSYSTEMTIME lpSystemTime;
  GetLocalTime(lpSystemTime);


  // Add code to set trigger structure?
  pTrigger.wBeginDay = lpSystemTime->wDay;                  // Required
  pTrigger.wBeginMonth = lpSystemTime->wMonth;                // Required
  pTrigger.wBeginYear =lpSystemTime->wYear;              // Required
  pTrigger.cbTriggerSize = sizeof (TASK\_TRIGGER); 
  pTrigger.wStartHour = lpSystemTime->wHour;
  pTrigger.wStartMinute = lpSystemTime->wMinute + 2;
  pTrigger.TriggerType = TASK\_TIME\_TRIGGER\_DAILY;
  pTrigger.Type.Daily.DaysInterval = 1;


  ///////////////////////////////////////////////////////////////////
  // Call ITaskTrigger::SetTrigger to set trigger criteria.
  ///////////////////////////////////////////////////////////////////

  hr = pITaskTrigger->SetTrigger (&pTrigger);
  if (FAILED(hr))
  {
    wprintf(L"Failed calling ITaskTrigger::SetTrigger: ");
    wprintf(L"error = 0x\%x
",hr);
    pITask->Release();
    pITaskTrigger->Release();
    CoUninitialize();
    return 1;
  }




  /////////////////////////////////////////////////////////////////
  // Call IUnknown::QueryInterface to get a pointer to 
  // IPersistFile and IPersistFile::Save to save 
  // the new task to disk.
  /////////////////////////////////////////////////////////////////

  hr = pITask->QueryInterface(IID\_IPersistFile,
                              (void **)&pIPersistFile);

  pITask->Release();
  if (FAILED(hr))
  {
     CoUninitialize();
     fprintf(stderr, "Failed calling QueryInterface, error = 0x\%x
",hr);
     return 1;
  }


  hr = pIPersistFile->Save(NULL,
                           TRUE);
  pIPersistFile->Release();
  if (FAILED(hr))
  {
     CoUninitialize();
     fprintf(stderr, "Failed calling Save, error = 0x\%x
",hr);
     return 1;
  }


  CoUninitialize();
  printf("Created task.
");
  return 0;
}


EDIT:



Jeg tilføjede følgende:


  /////////////////////////////////////////////////////////////////
  //Set Flags
  /////////////////////////////////////////////////////////////////

  pITask->SetFlags(TASK\_FLAG\_RUN\_ONLY\_IF\_LOGGED\_ON);


og:


///////////////////////////////////////////////////////////////////
  // Call ITask::SetAccountInformation to specify the account name
  // and the account password for Test Task.
  ///////////////////////////////////////////////////////////////////
  hr = pITask->SetAccountInformation(L"", 
            NULL);


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


Nu bliver opgaven vist i opgaveplanlæggeren og udføres under SYSTEM-konto (Notepad.exe vises ikke, da SYSTEM-kontoen ikke er interaktiv med skrivebord eller noget). Hvis jeg ændrer det til hr = pITask->SetAccountInformation(L"MyUserName", NULL);, vises Notepad. Problem løst :).

Bedste reference


Sæt flag:


pITask->SetFlags(TASK\_FLAG\_RUN\_ONLY\_IF\_LOGGED\_ON);


Indstil kontooplysninger:


hr = pITask->SetAccountInformation(L"Username", 
            NULL);


Og Bob er din onkel