Удалить запланированное задание, используя 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 возвращает существующее задание
Я также попробовал этот код с правами администратора / системы / службы, и ни один не смог найти и удалить задачу.

Есть какой-то пропущенный параметр или метод, который нужно вызвать?
Спасибо!

1

Решение

Как подсказывает @IInspectable, решение заключается в использовании Планировщик заданий 2.0 Интерфейсы,
например 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector