如何使用 c++ 在任务计划程序中检查任务的触发器

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

本文关键字:任务 检查 触发器 程序 计划 何使用 c++      更新时间:2023-10-16

我想使用 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("ntCannot get the registered task state: %x", hr);
         } 
          hr = pRegisteredTask->get_State(&taskState);
          if (SUCCEEDED(hr))
       printf("ntState: %d", taskState);
          else
    printf("ntCannot 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(;

但这也没有给我任何价值

以下是代码片段的工作,你可以试试:

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("ntState: %d", taskState);
            else
                printf("ntCannot 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++(">

查看文档,看起来在你有一个IRegisteredTask之后,你需要调用get_Definition((来获取它的ITaskDefinition。

使用 ITaskDefinition,您可以通过 get_Triggers(( 获取 ITriggerCollection

然后,枚举 ITriggerCollection,您可以 QueryInterface(( 每个 ITrigger 查看它是否支持 ILogonTrigger 或 IBootTrigger 接口。