How to get ITimeTrigger interface for a Task Scheduler task?

0

I'm trying to get the "random delay" value for an arbitrary task scheduler task. I came up with the following C++ code:

//IRegisteredTask* pRegisteredTask for task:
//  Name: "Regular Maintenance"
//  Folder: "\Microsoft\Windows\TaskScheduler"

ITaskDefinition* pTaskDef = NULL;
HRESULT hr = pRegisteredTask->get_Definition(&pTaskDef);
if(SUCCEEDED(hr))
{
    //Get triggers
    ITriggerCollection* pTriggerCol = NULL;
    hr = pTaskDef->get_Triggers(&pTriggerCol);
    if(SUCCEEDED(hr))
    {
        //Get number of triggers
        LONG nTriggerCnt = 0;
        hr = pTriggerCol->get_Count(&nTriggerCnt);
        if(SUCCEEDED(hr))
        {
            //Look through all triggers
            for(LONG t = 0; t < nTriggerCnt; t++)
            {
                ITrigger* pTrigger = NULL;
                hr = pTriggerCol->get_Item(t + 1, &pTrigger);
                if(SUCCEEDED(hr))
                {
                    //Get time trigger interface
                    ITimeTrigger *pTimeTrigger = NULL;
                    hr = pTrigger->QueryInterface(IID_ITimeTrigger, (void**)&pTimeTrigger);
                    if(SUCCEEDED(hr))
                    {
                        BSTR bstrRndDelay = NULL;
                        hr = pTimeTrigger->get_RandomDelay(&bstrRndDelay);
                        if(SUCCEEDED(hr))
                        {
                            //Check random delay
                        }

                        SysFreeString(bstrRndDelay);
                    }
                    else
                    {
                        //0x80004002 (E_NOINTERFACE) error happens here
                    }

                    if(pTimeTrigger)
                        pTimeTrigger->Release();
                }

                if(pTrigger)
                    pTrigger->Release();
            }
        }
    }

    if(pTriggerCol)
        pTriggerCol->Release();
}

if(pTaskDef)
    pTaskDef->Release();

I'm testing the code snippet above on the task that I know has "random delay" set up, i.e., \Microsoft\Windows\TaskScheduler->Regular Maintenance on my Windows 8.1:

enter image description here

but for some reason when I try to get the ITimeTrigger interface I'm getting error 0x80004002 or E_NOINTERFACE (as I marked in the code above.)

Any idea what am I doing wrong?

c++
winapi
com
scheduled-tasks
asked on Stack Overflow Feb 14, 2015 by c00000fd

1 Answer

-1

For accessing Random delay in Task scheduler, we can't do it directly you have to access by all interfaces.

For suppose I am using IDailyTigger or IWeeklyTigger Interface from this you have to access random delay.

IWeeklyTigger*  lpWeeklyTrigger;
lpWeeklyTrigger->get_RandomDelay(&lcRandomDelay);
IDailyTigger* lpDailyTrigger;
lpDailyTrigger->get_RandomDelay(&lcRandomDelay);

This way you have to do for each trigger.

answered on Stack Overflow Apr 21, 2018 by Harshavardhan • edited Apr 21, 2018 by petezurich

User contributions licensed under CC BY-SA 3.0