2017-04-19 124 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; 
}