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

schtasks.exe /Query /TN exampletask을 실행하는 기존 작업을 반환하더라도 ERROR_FILE_NOT_FOUND를 반환 pITS->DeletedeleteTask(L"exampletask"); 방법을 실행.
또한이 코드를 admin/system/service 권한으로 시도했지만 아무도 해당 작업을 찾아서 삭제할 수 없습니다.

매개 변수가 누락되었거나 호출해야하는 메소드가 있습니까?
감사합니다.

+1

아마 즉시 관련,하지만 [ITaskScheduler :: 삭제] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa381820.aspx)에 대한 설명서 읽기하지 : * " 이 API는 이후 버전의 운영 체제 또는 제품에서 변경되거나 사용할 수 없으므로 [Task Scheduler 2.0 인터페이스] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383600.aspx)를 사용하십시오.) 대신 "* – IInspectable

+0

짐작하면 작업의 전체 경로를 지정해야합니다. 명령 줄 도구는 누락 된 경우 작업 루트 폴더를 의미합니다. 대신에'deleteTask (L "\\ exampletask");를 호출 할 수 있습니다. 자세한 정보 및 샘플 코드는 [ITaskFolder] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa381330.aspx) 설명서에서 사용할 수 있습니다. – IInspectable

답변

1

@@nspectable가 제시 한대로 해결책은 Task Scheduler 2.0 Interfaces, 과 같이 사용하는 것입니다. 대신 ITaskService이고, ITaskScheduler->Delete 대신 ITaskFolder->DeleteTask이 사용됩니다.

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; 
}