使用com对象删除计划任务

赫茨罗尼

我尝试了以下代码来删除计划任务:

bool deleteTask(std::wstring taskName)
    {
    if (FAILED(CoInitialize(nullptr))) {
        return false;
    }

    ITaskScheduler *pITS;
    if (FAILED(CoCreateInstance(CLSID_CTaskScheduler, nullptr, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, (void **)&pITS))) {
        CoUninitialize();
        return false;
    }

    HRESULT hr = pITS->Delete(taskName.c_str());
    pITS->Release();
    CoUninitialize();

    if (FAILED(hr)) {
        if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) {
            wprintf(L"ERROR_FILE_NOT_FOUND");
        }
        return false;
    }
    return true;
}

执行时deleteTask(L"exampletask");该方法pITS->Delete返回,ERROR_FILE_NOT_FOUND即使执行schtasks.exe /Query /TN exampletask返回现有任务。
我也用admin/system/service的权限试过这段代码,都没有成功找到并删除任务。

是否缺少一些参数,或者应该调用的方法?
谢谢!

赫茨罗尼

正如@IInspectable 所建议的,解决方案是使用Task Scheduler 2.0 Interfaces,例如ITaskService代替ITaskScheduler,而ITaskFolder->DeleteTask不是ITaskScheduler->Delete

bool deleteTask(std::wstring taskName)
{
    if (FAILED(CoInitialize(nullptr))) {
        return false;
    }

    ITaskService *pITS;
    if (FAILED(CoCreateInstance(CLSID_TaskScheduler, nullptr, CLSCTX_INPROC_SERVER, IID_ITaskService, (void **)&pITS))) {
        CoUninitialize();
        return false;
    }

    if (FAILED(pITS->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()))) {
        pITS->Release();
        CoUninitialize();
        return false;
    }

    ITaskFolder *pITF;
    if (FAILED(pITS->GetFolder(_bstr_t(L"\\"), &pITF))) {
        pITS->Release();
        CoUninitialize();
        return false;
    }

    pITS->Release();

    if (FAILED(pITF->DeleteTask(_bstr_t(taskName.c_str()), 0))) {
        pITF->Release();
        CoUninitialize();
        return false;
    }

    pITF->Release();

    CoUninitialize();

    return true;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章