380 lines
8.4 KiB
C++
380 lines
8.4 KiB
C++
#include "stdafx.h"
|
||
#include "MyTaskSchedule.h"
|
||
|
||
|
||
void ShowError(char *lpszText, DWORD dwErrCode)
|
||
{
|
||
char szErr[MAX_PATH] = {0};
|
||
::wsprintf(szErr, "%s Error!\nError Code Is:0x%08x\n", lpszText, dwErrCode);
|
||
::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
|
||
}
|
||
|
||
|
||
CMyTaskSchedule::CMyTaskSchedule(void)
|
||
{
|
||
m_lpITS = NULL;
|
||
m_lpRootFolder = NULL;
|
||
// 初始化COM
|
||
HRESULT hr = ::CoInitialize(NULL);
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("CoInitialize", hr);
|
||
}
|
||
// 创建一个任务服务(Task Service)实例
|
||
hr = ::CoCreateInstance(CLSID_TaskScheduler,
|
||
NULL,
|
||
CLSCTX_INPROC_SERVER,
|
||
IID_ITaskService,
|
||
(LPVOID *)(&m_lpITS));
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("CoCreateInstance", hr);
|
||
}
|
||
// 连接到任务服务(Task Service)
|
||
hr = m_lpITS->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("ITaskService::Connect", hr);
|
||
}
|
||
// 获取Root Task Folder的指针,这个指针指向的是新注册的任务
|
||
hr = m_lpITS->GetFolder(_bstr_t("\\"), &m_lpRootFolder);
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("ITaskService::GetFolder", hr);
|
||
}
|
||
}
|
||
|
||
|
||
CMyTaskSchedule::~CMyTaskSchedule(void)
|
||
{
|
||
if(m_lpITS)
|
||
{
|
||
m_lpITS->Release();
|
||
}
|
||
if(m_lpRootFolder)
|
||
{
|
||
m_lpRootFolder->Release();
|
||
}
|
||
// 卸载COM
|
||
::CoUninitialize();
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::Delete(char *lpszTaskName)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
CComVariant variantTaskName(NULL);
|
||
variantTaskName = lpszTaskName;
|
||
HRESULT hr = m_lpRootFolder->DeleteTask(variantTaskName.bstrVal, 0);
|
||
if(FAILED(hr))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::DeleteFolder(char *lpszFolderName)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
CComVariant variantFolderName(NULL);
|
||
variantFolderName = lpszFolderName;
|
||
HRESULT hr = m_lpRootFolder->DeleteFolder(variantFolderName.bstrVal, 0);
|
||
if(FAILED(hr))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::NewTask(char *lpszTaskName, char *lpszProgramPath, char *lpszParameters, char *lpszAuthor)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
// 如果存在相同的计划任务,则删除
|
||
Delete(lpszTaskName);
|
||
// 创建任务定义对象来创建任务
|
||
ITaskDefinition *pTaskDefinition = NULL;
|
||
HRESULT hr = m_lpITS->NewTask(0, &pTaskDefinition);
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("ITaskService::NewTask", hr);
|
||
return FALSE;
|
||
}
|
||
|
||
/* 设置注册信息 */
|
||
IRegistrationInfo *pRegInfo = NULL;
|
||
CComVariant variantAuthor(NULL);
|
||
variantAuthor = lpszAuthor;
|
||
hr = pTaskDefinition->get_RegistrationInfo(&pRegInfo);
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("pTaskDefinition::get_RegistrationInfo", hr);
|
||
return FALSE;
|
||
}
|
||
// 设置作者信息
|
||
hr = pRegInfo->put_Author(variantAuthor.bstrVal);
|
||
pRegInfo->Release();
|
||
|
||
/* 设置登录类型和运行权限 */
|
||
IPrincipal *pPrincipal = NULL;
|
||
hr = pTaskDefinition->get_Principal(&pPrincipal);
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("pTaskDefinition::get_Principal", hr);
|
||
return FALSE;
|
||
}
|
||
// 设置登录类型
|
||
hr = pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN);
|
||
// 设置运行权限
|
||
// 最高权限
|
||
hr = pPrincipal->put_RunLevel(TASK_RUNLEVEL_HIGHEST);
|
||
pPrincipal->Release();
|
||
|
||
/* 设置其他信息 */
|
||
ITaskSettings *pSettting = NULL;
|
||
hr = pTaskDefinition->get_Settings(&pSettting);
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("pTaskDefinition::get_Settings", hr);
|
||
return FALSE;
|
||
}
|
||
// 设置其他信息
|
||
hr = pSettting->put_StopIfGoingOnBatteries(VARIANT_FALSE);
|
||
hr = pSettting->put_DisallowStartIfOnBatteries(VARIANT_FALSE);
|
||
hr = pSettting->put_AllowDemandStart(VARIANT_TRUE);
|
||
hr = pSettting->put_StartWhenAvailable(VARIANT_FALSE);
|
||
hr = pSettting->put_MultipleInstances(TASK_INSTANCES_PARALLEL);
|
||
pSettting->Release();
|
||
|
||
/* 创建执行动作 */
|
||
IActionCollection *pActionCollect = NULL;
|
||
hr = pTaskDefinition->get_Actions(&pActionCollect);
|
||
if(FAILED(hr))
|
||
{
|
||
ShowError("pTaskDefinition::get_Actions", hr);
|
||
return FALSE;
|
||
}
|
||
IAction *pAction = NULL;
|
||
// 创建执行操作
|
||
hr = pActionCollect->Create(TASK_ACTION_EXEC, &pAction);
|
||
pActionCollect->Release();
|
||
|
||
/* 设置执行程序路径和参数 */
|
||
CComVariant variantProgramPath(NULL);
|
||
CComVariant variantParameters(NULL);
|
||
IExecAction *pExecAction = NULL;
|
||
hr = pAction->QueryInterface(IID_IExecAction, (PVOID *)(&pExecAction));
|
||
if(FAILED(hr))
|
||
{
|
||
pAction->Release();
|
||
ShowError("IAction::QueryInterface", hr);
|
||
return FALSE;
|
||
}
|
||
pAction->Release();
|
||
// 设置程序路径和参数
|
||
variantProgramPath = lpszProgramPath;
|
||
variantParameters = lpszParameters;
|
||
pExecAction->put_Path(variantProgramPath.bstrVal);
|
||
pExecAction->put_Arguments(variantParameters.bstrVal);
|
||
pExecAction->Release();
|
||
|
||
/* 创建触发器,实现用户登陆自启动 */
|
||
ITriggerCollection *pTriggers = NULL;
|
||
hr = pTaskDefinition->get_Triggers(&pTriggers);
|
||
if (FAILED(hr))
|
||
{
|
||
ShowError("pTaskDefinition::get_Triggers", hr);
|
||
return FALSE;
|
||
}
|
||
// 创建触发器
|
||
ITrigger *pTrigger = NULL;
|
||
hr = pTriggers->Create(TASK_TRIGGER_LOGON, &pTrigger);
|
||
if (FAILED(hr))
|
||
{
|
||
ShowError("ITriggerCollection::Create", hr);
|
||
return FALSE;
|
||
}
|
||
|
||
/* 注册任务计划 */
|
||
IRegisteredTask *pRegisteredTask = NULL;
|
||
CComVariant variantTaskName(NULL);
|
||
variantTaskName = lpszTaskName;
|
||
hr = m_lpRootFolder->RegisterTaskDefinition(variantTaskName.bstrVal,
|
||
pTaskDefinition,
|
||
TASK_CREATE_OR_UPDATE,
|
||
_variant_t(),
|
||
_variant_t(),
|
||
TASK_LOGON_INTERACTIVE_TOKEN,
|
||
_variant_t(""),
|
||
&pRegisteredTask);
|
||
if(FAILED(hr))
|
||
{
|
||
pTaskDefinition->Release();
|
||
ShowError("ITaskFolder::RegisterTaskDefinition", hr);
|
||
return FALSE;
|
||
}
|
||
pTaskDefinition->Release();
|
||
pRegisteredTask->Release();
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::IsExist(char *lpszTaskName)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
HRESULT hr = S_OK;
|
||
CComVariant variantTaskName(NULL);
|
||
CComVariant variantEnable(NULL);
|
||
variantTaskName = lpszTaskName; // 任务计划名称
|
||
IRegisteredTask *pRegisteredTask = NULL;
|
||
// 获取任务计划
|
||
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
||
if(FAILED(hr) || (NULL == pRegisteredTask))
|
||
{
|
||
return FALSE;
|
||
}
|
||
pRegisteredTask->Release();
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::IsTaskValid(char *lpszTaskName)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
HRESULT hr = S_OK;
|
||
CComVariant variantTaskName(NULL);
|
||
CComVariant variantEnable(NULL);
|
||
variantTaskName = lpszTaskName; // 任务计划名称
|
||
IRegisteredTask *pRegisteredTask = NULL;
|
||
// 获取任务计划
|
||
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
||
if(FAILED(hr) || (NULL == pRegisteredTask))
|
||
{
|
||
return FALSE;
|
||
}
|
||
// 获取任务状态
|
||
TASK_STATE taskState;
|
||
hr = pRegisteredTask->get_State(&taskState);
|
||
if(FAILED(hr))
|
||
{
|
||
pRegisteredTask->Release();
|
||
return FALSE;
|
||
}
|
||
pRegisteredTask->Release();
|
||
// 无效
|
||
if(TASK_STATE_DISABLED == taskState)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::Run(char *lpszTaskName, char *lpszParam)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
HRESULT hr = S_OK;
|
||
CComVariant variantTaskName(NULL);
|
||
CComVariant variantParameters(NULL);
|
||
variantTaskName = lpszTaskName;
|
||
variantParameters = lpszParam;
|
||
|
||
// 获取任务计划
|
||
IRegisteredTask *pRegisteredTask = NULL;
|
||
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
||
if(FAILED(hr) || (NULL == pRegisteredTask))
|
||
{
|
||
return FALSE;
|
||
}
|
||
// 运行
|
||
hr = pRegisteredTask->Run(variantParameters, NULL);
|
||
if(FAILED(hr))
|
||
{
|
||
pRegisteredTask->Release();
|
||
return FALSE;
|
||
}
|
||
pRegisteredTask->Release();
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::IsEnable(char *lpszTaskName)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
HRESULT hr = S_OK;
|
||
CComVariant variantTaskName(NULL);
|
||
CComVariant variantEnable(NULL);
|
||
variantTaskName = lpszTaskName; // 任务计划名称
|
||
IRegisteredTask *pRegisteredTask = NULL;
|
||
// 获取任务计划
|
||
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
||
if(FAILED(hr) || (NULL == pRegisteredTask))
|
||
{
|
||
return FALSE;
|
||
}
|
||
// 获取是否已经启动
|
||
pRegisteredTask->get_Enabled(&variantEnable.boolVal);
|
||
pRegisteredTask->Release();
|
||
if(ATL_VARIANT_FALSE == variantEnable.boolVal)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL CMyTaskSchedule::SetEnable(char *lpszTaskName, BOOL bEnable)
|
||
{
|
||
if(NULL == m_lpRootFolder)
|
||
{
|
||
return FALSE;
|
||
}
|
||
HRESULT hr = S_OK;
|
||
CComVariant variantTaskName(NULL);
|
||
CComVariant variantEnable(NULL);
|
||
variantTaskName = lpszTaskName; // 任务计划名称
|
||
variantEnable = bEnable; // 是否启动
|
||
IRegisteredTask *pRegisteredTask = NULL;
|
||
// 获取任务计划
|
||
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
||
if(FAILED(hr) || (NULL == pRegisteredTask))
|
||
{
|
||
return FALSE;
|
||
}
|
||
// 设置是否启动
|
||
pRegisteredTask->put_Enabled(variantEnable.boolVal);
|
||
pRegisteredTask->Release();
|
||
|
||
return TRUE;
|
||
}
|
||
|