zoukankan      html  css  js  c++  java
  • 开机自启动win7计划任务

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

  • 相关阅读:
    写代码随想
    学生管理系统
    自定义栈
    位运算符加密
    自定义Vector
    二叉树排序
    双向循环链表
    双向链表
    加载properties文件
    通讯录
  • 原文地址:https://www.cnblogs.com/lzjsky/p/1929559.html
Copyright © 2011-2022 走看看