2017-04-19 101 views
1

我尝试下面的代码删除计划任务删除计划任务:使用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的权限试过这段代码,没有找到并删除任务。

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

+1

或许不会直接相关,但对[ITaskScheduler ::删除](https://msdn.microsoft.com/en-us/library/windows/desktop/aa381820.aspx)的文件中读取:*”此API可能会在后续版本的操作系统或产品中被更改或无法使用。请使用[Task Scheduler 2.0 Interfaces](https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa383600.aspx )。* – IInspectable

+0

推测,您需要指定任务的完整路径,其中命令行工具隐含任务根文件夹(如果缺失)。你可以尝试调用'deleteTask(L“\\ exampletask”);'而不是。更多信息和示例代码可从[ITaskFolder](https://msdn.microsoft.com/en-us/library/windows/desktop/aa381330.aspx)文档获得。 – IInspectable

回答

1

正如我们可以预料的那样,解决方案是使用Task Scheduler 2.0 Interfaces, ITaskService而不是ITaskSchedulerITaskFolder->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; 
}