C++创建windows计划任务代码
时间: 2023-12-23 08:05:02 浏览: 156
以下是使用C++创建Windows计划任务的示例代码:
```c++
#include <Windows.h>
#include <taskschd.h>
#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")
int main() {
HRESULT hr;
ITaskService *pService = NULL;
ITaskFolder *pRootFolder = NULL;
ITaskDefinition *pTask = NULL;
IRegistrationInfo *pRegInfo = NULL;
ITaskSettings *pSettings = NULL;
IPrincipal *pPrincipal = NULL;
IActionCollection *pActionCollection = NULL;
IAction *pAction = NULL;
IExecAction *pExecAction = NULL;
ITriggerCollection *pTriggerCollection = NULL;
ITrigger *pTrigger = NULL;
ISessionStateChangeTrigger *pSessionTrigger = NULL;
ITaskNamedValueCollection *pNamedValueCollection = NULL;
ITaskFolder *pTaskFolder = NULL;
BSTR taskName = SysAllocString(L"My Task Name");
BSTR taskDesc = SysAllocString(L"My Task Description");
BSTR execPath = SysAllocString(L"C:\\MyApp\\MyApp.exe");
BSTR workingDirectory = SysAllocString(L"C:\\MyApp");
BSTR taskAuthor = SysAllocString(L"My Company");
BSTR taskAccountName = SysAllocString(L"");
BSTR taskAccountPwd = SysAllocString(L"");
TASK_STATE taskState;
VARIANT_BOOL bEnabled;
// 初始化 COM
CoInitialize(NULL);
// 创建任务服务
hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&pService);
if (FAILED(hr)) {
wprintf(L"Error: Could not create task service instance: %x\n", hr);
goto cleanup;
}
// 连接到任务服务
hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());
if (FAILED(hr)) {
wprintf(L"Error: Could not connect to task service: %x\n", hr);
goto cleanup;
}
// 获取任务根目录
hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);
if (FAILED(hr)) {
wprintf(L"Error: Could not get root folder: %x\n", hr);
goto cleanup;
}
// 创建任务定义
hr = pService->NewTask(0, &pTask);
if (FAILED(hr)) {
wprintf(L"Error: Could not create task definition: %x\n", hr);
goto cleanup;
}
// 设置任务名称和描述
hr = pTask->get_RegistrationInfo(&pRegInfo);
if (FAILED(hr)) {
wprintf(L"Error: Could not get registration info: %x\n", hr);
goto cleanup;
}
hr = pRegInfo->put_Author(taskAuthor);
if (FAILED(hr)) {
wprintf(L"Error: Could not set author: %x\n", hr);
goto cleanup;
}
hr = pRegInfo->put_Description(taskDesc);
if (FAILED(hr)) {
wprintf(L"Error: Could not set description: %x\n", hr);
goto cleanup;
}
// 设置任务设置
hr = pTask->get_Settings(&pSettings);
if (FAILED(hr)) {
wprintf(L"Error: Could not get settings: %x\n", hr);
goto cleanup;
}
hr = pSettings->put_StartWhenAvailable(VARIANT_TRUE);
if (FAILED(hr)) {
wprintf(L"Error: Could not set start when available: %x\n", hr);
goto cleanup;
}
// 设置任务主体
hr = pTask->get_Principal(&pPrincipal);
if (FAILED(hr)) {
wprintf(L"Error: Could not get principal: %x\n", hr);
goto cleanup;
}
hr = pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN);
if (FAILED(hr)) {
wprintf(L"Error: Could not set logon type: %x\n", hr);
goto cleanup;
}
// 添加任务操作
hr = pTask->get_Actions(&pActionCollection);
if (FAILED(hr)) {
wprintf(L"Error: Could not get action collection: %x\n", hr);
goto cleanup;
}
hr = pActionCollection->Create(TASK_ACTION_EXEC, &pAction);
if (FAILED(hr)) {
wprintf(L"Error: Could not create action: %x\n", hr);
goto cleanup;
}
hr = pAction->QueryInterface(IID_IExecAction, (void**)&pExecAction);
if (FAILED(hr)) {
wprintf(L"Error: Could not get exec action interface: %x\n", hr);
goto cleanup;
}
hr = pExecAction->put_Path(execPath);
if (FAILED(hr)) {
wprintf(L"Error: Could not set action path: %x\n", hr);
goto cleanup;
}
hr = pExecAction->put_WorkingDirectory(workingDirectory);
if (FAILED(hr)) {
wprintf(L"Error: Could not set action working directory: %x\n", hr);
goto cleanup;
}
// 添加任务触发器
hr = pTask->get_Triggers(&pTriggerCollection);
if (FAILED(hr)) {
wprintf(L"Error: Could not get trigger collection: %x\n", hr);
goto cleanup;
}
hr = pTriggerCollection->Create(TASK_TRIGGER_SESSION_STATE_CHANGE, &pTrigger);
if (FAILED(hr)) {
wprintf(L"Error: Could not create trigger: %x\n", hr);
goto cleanup;
}
hr = pTrigger->QueryInterface(IID_ISessionStateChangeTrigger, (void**)&pSessionTrigger);
if (FAILED(hr)) {
wprintf(L"Error: Could not get session state change trigger interface: %x\n", hr);
goto cleanup;
}
hr = pSessionTrigger->put_IdleWaitMinutes(15);
if (FAILED(hr)) {
wprintf(L"Error: Could not set idle wait minutes: %x\n", hr);
goto cleanup;
}
// 设置任务命名值集合
hr = pTask->get_Parameters(&pNamedValueCollection);
if (FAILED(hr)) {
wprintf(L"Error: Could not get named value collection: %x\n", hr);
goto cleanup;
}
hr = pNamedValueCollection->Create(L"Parameter1", _variant_t(L"Value1"), NULL);
if (FAILED(hr)) {
wprintf(L"Error: Could not create named value: %x\n", hr);
goto cleanup;
}
// 添加任务到任务根目录
hr = pRootFolder->CreateFolder(taskName, taskAuthor, &pTaskFolder);
if (FAILED(hr)) {
wprintf(L"Error: Could not create task folder: %x\n", hr);
goto cleanup;
}
hr = pTaskFolder->RegisterTaskDefinition(taskName, pTask, TASK_CREATE_OR_UPDATE, _variant_t(taskAccountName), _variant_t(taskAccountPwd), TASK_LOGON_INTERACTIVE_TOKEN, _variant_t(L""), &bEnabled);
if (FAILED(hr)) {
wprintf(L"Error: Could not register task definition: %x\n", hr);
goto cleanup;
}
// 获取任务状态
hr = pTask->get_State(&taskState);
if (FAILED(hr)) {
wprintf(L"Error: Could not get task state: %x\n", hr);
goto cleanup;
}
if (taskState == TASK_STATE_DISABLED) {
wprintf(L"Warning: Task is disabled.\n");
}
// 清理
cleanup:
if (pService) pService->Release();
if (pRootFolder) pRootFolder->Release();
if (pTask) pTask->Release();
if (pRegInfo) pRegInfo->Release();
if (pSettings) pSettings->Release();
if (pPrincipal) pPrincipal->Release();
if (pActionCollection) pActionCollection->Release();
if (pAction) pAction->Release();
if (pExecAction) pExecAction->Release();
if (pTriggerCollection) pTriggerCollection->Release();
if (pTrigger) pTrigger->Release();
if (pSessionTrigger) pSessionTrigger->Release();
if (pNamedValueCollection) pNamedValueCollection->Release();
if (pTaskFolder) pTaskFolder->Release();
SysFreeString(taskName);
SysFreeString(taskDesc);
SysFreeString(execPath);
SysFreeString(workingDirectory);
SysFreeString(taskAuthor);
SysFreeString(taskAccountName);
SysFreeString(taskAccountPwd);
// 释放 COM
CoUninitialize();
return 0;
}
```
请注意,此示例代码假定您的应用程序具有在Windows任务计划程序上创建任务所需的权限。如果您的应用程序没有这些权限,您需要先获得这些权限才能创建任务。
阅读全文