使用 com 对象删除计划任务
Delete a scheduled task using com objects
我尝试了以下删除计划任务的代码:
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
returnsERROR_FILE_NOT_FOUND
即使执行schtasks.exe /Query /TN exampletask
returns现有任务
我也用admin/system/service的权限试过这段代码,none成功找到并删除任务
是否缺少某些参数,或者应该调用的方法?
谢谢!
正如@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;
}
我尝试了以下删除计划任务的代码:
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
returnsERROR_FILE_NOT_FOUND
即使执行schtasks.exe /Query /TN exampletask
returns现有任务
我也用admin/system/service的权限试过这段代码,none成功找到并删除任务
是否缺少某些参数,或者应该调用的方法?
谢谢!
正如@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;
}