李sir_Blog

博客园 首页 联系 订阅 管理

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

posted on 2011-01-07 11:36  李sir  阅读(5267)  评论(0编辑  收藏  举报