#include <atlbase.h>
#include <taskschd.h>
void AddVistaTask() //创建计划任务
{
CComPtr<ITaskService> service;
CComPtr<ITaskFolder> root_folder;
CComPtr<ITaskFolder> new_folder;
CComPtr<IRegisteredTask> new_task;
CComPtr<ITaskDefinition> task_def;
CComPtr<IActionCollection> actions;
CComPtr<IAction> act1;
CComPtr<ITriggerCollection> triggers;
CComPtr<ITrigger> trig1;
CComPtr<IPrincipal> principal;
//创建实例
HRESULT hr = service.CoCreateInstance(__uuidof(TaskScheduler));
if(FAILED(hr))
{
return;
}
//用默认的用户连接本地计算机
hr = service->Connect(CComVariant(), // local computer
CComVariant(), // current user
CComVariant(), // current domain
CComVariant()); // no password
if(FAILED(hr))
{
return;
}
//得到根任务文件夹
hr = service->GetFolder(CComBSTR(L"\\"), &root_folder);
if(FAILED(hr))
{
return;
}
//打开我的任务文件夹
hr = root_folder->GetFolder(CComBSTR(L"Feitian\\NetRockey4"), &new_folder);
if(FAILED(hr)) //如果文件夹不存在,就创建一个
{
hr = root_folder->CreateFolder(CComBSTR(L"Feitian\\NetRockey4"),
CComVariant(), &new_folder); //使用默认的安全描述符
if(FAILED(hr))
{
return;
}
}
//找到名字为"RunAtOnce"的任务
hr = new_folder->GetTask(CComBSTR(L"RunAtOnce"), &new_task);
if(FAILED(hr))
{
//如果没有找到就创建一个空任务
hr = service->NewTask(0, &task_def);
if(FAILED(hr))
{
return;
}
//得到动作集合
hr = task_def->get_Actions(&actions);
if(FAILED(hr))
{
return;
}
//在动作集合中创建动作
hr = actions->Create(TASK_ACTION_EXEC, &act1);
if(FAILED(hr))
{
return;
}
//向动作里面写入执行程序
CComQIPtr<IExecAction> exec_act(act1);
WCHAR exe_path[400] = {0};
GetModuleFileNameW(0, exe_path, 400);
hr = exec_act->put_Path(CComBSTR(exe_path)); //运行本程序
if(FAILED(hr))
{
return;
}
hr = exec_act->put_Arguments(CComBSTR(L"-systray")); //向动作里面写入执行程序的参数
if(FAILED(hr))
{
return;
}
//得到触发器集合
hr = task_def->get_Triggers(&triggers);
if(FAILED(hr))
{
return;
}
//在触发器集合中创建触发器
hr = triggers->Create(TASK_TRIGGER_LOGON, &trig1); //当用户启动时触发
if(FAILED(hr))
{
return;
}
//指定最高权限
hr = task_def->get_Principal(&principal);
if(FAILED(hr))
{
return;
}
hr = principal->put_RunLevel(TASK_RUNLEVEL_HIGHEST);
if(FAILED(hr))
{
return;
}
//把任务添加到目录中去
hr = new_folder->RegisterTaskDefinition(CComBSTR(L"RunAtOnce"), //新任务的名称
task_def,
TASK_CREATE_OR_UPDATE,
CComVariant(), // user name
CComVariant(), // password
TASK_LOGON_INTERACTIVE_TOKEN,
CComVariant(), // sddl
&new_task);
if(FAILED(hr))
{
return;
}
}
else //如果找到了那个任务,就检查路径对不对
{
else //如果找到了那个任务,就检查路径对不对
{
//得到任务定义
hr = new_task->get_Definition(&task_def);
if(FAILED(hr))
{
return;
}
//得到动作集合
hr = task_def->get_Actions(&actions);
if(FAILED(hr))
{
return;
}
//在动作集合中得到动作
hr = actions->get_Item(1, &act1);
if(FAILED(hr))
{
return;
}
//得到动作中的执行程序
CComQIPtr<IExecAction> exec_act(act1);
CComBSTR exe_path2;
hr = exec_act->get_Path(&exe_path2);
WCHAR exe_path[400] = {0};
GetModuleFileNameW(0, exe_path, 400);
CComBSTR exe_path3(exe_path);
//如果路径不同就修改路径
if(exe_path3 != exe_path2)
{
hr = exec_act->put_Path(exe_path3);
if(FAILED(hr))
{
return;
}
//修改任务
hr = new_folder->RegisterTaskDefinition(CComBSTR(L"RunAtOnce"), //新任务的名称
task_def,
TASK_CREATE_OR_UPDATE,
CComVariant(), // user name
CComVariant(), // password
TASK_LOGON_INTERACTIVE_TOKEN,
CComVariant(), // sddl
&new_task);
if(FAILED(hr))
{
return;
}
}
}
}
//移除Vista的计划任务
void RemoveVistaTask()
{
CComPtr<ITaskService> service;
CComPtr<ITaskFolder> root_folder;
CComPtr<ITaskFolder> new_folder;
CComPtr<IRegisteredTask> new_task;
CComPtr<ITaskDefinition> task_def;
CComPtr<IActionCollection> actions;
CComPtr<IAction> act1;
CComPtr<ITriggerCollection> triggers;
CComPtr<ITrigger> trig1;
CComPtr<IPrincipal> principal;
//创建实例
HRESULT hr = service.CoCreateInstance(__uuidof(TaskScheduler));
if(FAILED(hr))
{
return;
}
//用默认的用户连接本地计算机
hr = service->Connect(CComVariant(), // local computer
CComVariant(), // current user
CComVariant(), // current domain
CComVariant()); // no password
if(FAILED(hr))
{
return;
}
//得到根任务文件夹
hr = service->GetFolder(CComBSTR(L"\\"), &root_folder);
if(FAILED(hr))
{
return;
}
//打开我的任务文件夹
hr = root_folder->GetFolder(CComBSTR(L"Feitian\\NetRockey4"), &new_folder);
if(FAILED(hr)) //如果文件夹不存在,就创建一个
{
return;
}
//找到任务
hr = new_folder->GetTask(CComBSTR(L"RunAtOnce"), &new_task);
if(FAILED(hr))
{
return;
}
//删除任务
hr = new_folder->DeleteTask(CComBSTR(L"RunAtOnce"), 0);
if(FAILED(hr))
{
return;
}
}