Как проверить триггер задачи в планировщике заданий, используя c ++? - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу проверить триггеры для задач в планировщике заданий, используя c ++.Я хочу использовать функцию HRESULT get_Type (TASK_TRIGGER_TYPE2 * pType); , чтобы проверить, является ли задача входом в систему или запускается при загрузке.

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

При компиляции выдается сообщение об ошибке "IRegisteredTask не имеет члена get_Type () "

Затем я изменил код и добавил ITrigger * trig = NULL;trig-> get_Type (& pType);

Но это не дает мне никаких значений либо

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ниже приведен пример работы кода, и вы можете попробовать:

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

См. " Отображение имен и состояний задач (C ++) "

0 голосов
/ 11 февраля 2019

Глядя на документацию , похоже, что после того, как у вас есть IRegisteredTask, вам нужно вызвать get_Definition (), чтобы получить его ITaskDefinition.

Используя ITaskDefinition, вы можете получить ITriggerCollection через get_Triggers ()

Затем, перечисляя ITriggerCollection, вы можете QueryInterface () каждого ITrigger, чтобы увидеть, поддерживает ли он интерфейсы ILogonTrigger или IBootTrigger..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...