使用 com 对象删除计划任务

Delete a scheduled task using com objects

本文关键字:计划 任务 删除 对象 com 使用      更新时间:2023-10-16

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

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");时 即使执行schtasks.exe /Query /TN exampletask返回现有任务,该方法pITS->Delete也会返回ERROR_FILE_NOT_FOUND
我还以管理员/系统/服务的权限尝试了此代码,但没有成功查找和删除任务。

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

正如@IInspectable建议的那样,解决方案是使用任务计划程序 2.0 接口, 例如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;
}