c++windowswinapitriggerstaskscheduler

How to check trigger of a task in Task scheduler using c++?


I want to check the triggers for the tasks in the Task scheduler using c++. I want to use the function HRESULT get_Type(TASK_TRIGGER_TYPE2 *pType); to check whether the task is logon or boot triggered.

TASK_STATE taskState;

for (LONG i = 0; i < numTasks; i++)
{
  IRegisteredTask* pRegisteredTask = NULL;
  hr = pTaskCollection->get_Item(_variant_t(i + 1), &pRegisteredTask);

 if (SUCCEEDED(hr))
    {
        BSTR taskName = NULL;
                    TASK_TRIGGER_TYPE2 *pType = NULL;
        hr = pRegisteredTask->get_Name(&taskName);               
        if (SUCCEEDED(hr))
        {
          printf("\nTask Name: %S", taskName);
          SysFreeString(taskName);
          hr = pRegisteredTask->get_Type(*pType);   //Implemented here
          if (SUCCEEDED(hr))
             printf("\n%s",&pType);
          else
             printf("\n\tCannot get the registered task state: %x", hr);
         } 

          hr = pRegisteredTask->get_State(&taskState);
          if (SUCCEEDED(hr))
       printf("\n\tState: %d", taskState);
          else
    printf("\n\tCannot get the registered task state: %x", hr);
        }
        else
        {
    printf("\nCannot get the registered task name: %x", hr);
        }
    pRegisteredTask->Release();
    }
    else
    {
printf("\nCannot get the registered task item at index=%d: %x", i + 1, hr);
    }
}

On compilation, it gives me an error saying "IRegisteredTask has no member get_Type()"

Then I altered the code and added ITrigger *trig = NULL; trig->get_Type(&pType);

But that doesnt give me any values either


Solution

  • The following is code piece works fore me you can have a try:

    for (LONG i = 0; i < numTasks; i++)
    {
        IRegisteredTask* pRegisteredTask = NULL;
        hr = pTaskCollection->get_Item(_variant_t(i + 1), &pRegisteredTask);
    
        if (SUCCEEDED(hr))
        {
            BSTR taskName = NULL;
            hr = pRegisteredTask->get_Name(&taskName);
            if (SUCCEEDED(hr))
            {
                printf("\nTask Name: %S", taskName);
                SysFreeString(taskName);
    
                hr = pRegisteredTask->get_State(&taskState);
                if (SUCCEEDED(hr))
                    printf("\n\tState: %d", taskState);
                else
                    printf("\n\tCannot get the registered task state: %x", hr);
            }
            else
            {
                printf("\nCannot get the registered task name: %x", hr);
            }
    
            ITaskDefinition* taskDef = NULL;
            hr = pRegisteredTask->get_Definition(&taskDef);
            if (SUCCEEDED(hr))
            {
                ITriggerCollection* triggers = NULL;
                taskDef->get_Triggers(&triggers);
                LONG trigCnt = 0;
                triggers->get_Count(&trigCnt);
    
                for (LONG i = 0; i < trigCnt; i++)
                {
                    ITrigger* trig = NULL;
                    TASK_TRIGGER_TYPE2 pType = TASK_TRIGGER_EVENT;
    
                    triggers->get_Item(_variant_t(i + 1), &trig);
                    trig->get_Type(&pType);
                    DWORD errCode = GetLastError();
                    if(pType != NULL)
                        printf("\nTrigger Type : %d", pType);
                }
    
            }
            else
            {
                printf("\nCannot get the registered task definition: %x", hr);
            }
    
            pRegisteredTask->Release();
        }
        else
        {
            printf("\nCannot get the registered task item at index=%d: %x", i + 1, hr);
        }
    }
    

    Refer to "Displaying Task Names and States (C++)"