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

转载于:https://www.cnblogs.com/lzjsky/archive/2011/01/07/1929559.html

开机自启动win7计划任务相关推荐

  1. win10开机自启动在哪里设置(Win10设置开机自启动)

    Outlook在Win10系统计划任务自启动应用如何设置呢? Outlook在Win10系统计划任务自启动应用设置如下: 1.打开我们的控制面板,在众多的命令菜单中,选择点击:管理工具. 2.在管理工 ...

  2. html 启动bat脚本,Windows开机自启动bat脚本设置方法

    摘要 腾兴网为您分享:Windows开机自启动bat脚本设置方法,小睡眠,小书亭,托迈酷客,土豆等软件知识,以及显卡加亮,团购宝,多和梦,pdf编辑器,杭州地铁线路图,宝宝拼图游戏,蠕虫病毒专杀工具, ...

  3. EasyRMS录播管理服务器项目实战:windows上开机自启动NodeJS服务

    本文转自EasyDarwin开源团队成员Penggy的博客:http://www.jianshu.com/p/ef840505ae06 近期在EasyDarwin开源团队开发一款基于EasyDarwi ...

  4. Oracle数据库开机自启动

    如果服务器断电重启或计划内重启,在服务器的操作系统启动后,需要手工启动数据库实例和监听,本文介绍如何把Oracle数据库的启动和关闭配置成系统服务,在操作系统启动/关闭时,自动启动/关闭Oracle实 ...

  5. 计算机win7如何加快开机速度,win7快速开机到八秒,怎么加快win7开机速度

    [导读]现在计算机的发展越来越快,由原来的台式机逐步的进化到了笔记本,甚至是一体机. 发展之迅速可以说是令人赞叹. 与此同时,这个软件也在不断地更新中. 微软研发出了win7操作系统,以前辉煌一时的w ...

  6. 实现 外网 远程桌面 连接 个人pc(开机自启动,校园网web自动验证,多用户远程桌面)

    背景:直接原因,游戏本好重,想有轻度需求时,不带电脑出门.但又因向日葵.teamviewer之类的控制软件网速限制且操作兼容性一般,所以想用nw(防敏感)穿透+windows远程桌面的形式,实现肥宅的 ...

  7. Linux下如何设置程序的开机自启动功能

    文章目录 Linux下设置程序开机自启动 1./etc/rc.local 2./etc/profile.d/ 3.使用 crontab 方式 4.使用 systemd 服务 测试代码 Linux下设置 ...

  8. Linux 之 开机自启动

    Linux系统设置开机自动运行脚本的方法 方法1: rc.local /etc/rc.d/rc.local 文件会在linux系统各项服务都启动完毕后再被运行,可以将脚本路径加到该文件里 将要执行的脚 ...

  9. Window服务器指定某软件/服务开机自启动

    在我们工作学习的过程中,难免会遇到使用Windows作为服务器,服务器中的某些软件或者服务必须时刻都在运行着,但是假如断电后,或者重启服务器,我们又得手动去开启某些软件以获取特定服务!这就给我们的工作 ...

最新文章

  1. 生信入门必须掌握的 30 个 Linux 命令
  2. 最常用的15大Eclipse开发快捷键技巧
  3. oracle pid查看,查看佔用aix oracle pid
  4. Linux系统VIM编辑器管理(2)
  5. 学习mysql中使用inner join,left join 等
  6. 过去3个多月的1200个小时里,我收获了什么?| 2021年年中总结
  7. 向指定的服务器端口发送信息,向指定服务器的指定端口发送UDP包
  8. java声明接口_为什么必须用Java声明接口?
  9. BZOJ1101 [POI2007] Zap
  10. 认知无线电的能量检测
  11. 第三章 DirectX 图形绘制(上)
  12. 2021谷歌IO大会内容
  13. PHP怎么加入购物车MySQL_php实现简单加入购物车功能
  14. [转]94个比付费软件更好的免费软件
  15. 微信小程序父子组件传值问题
  16. 详解created和mounted区别与使用场景
  17. jquery-3.5.1.js net::ERR_ABORTED 404
  18. 生育应用程序Flo与FTC协议解决滥用健康数据问题
  19. Mifare plus卡调试总结
  20. 【java笔记】Map,HashMap,Collections

热门文章

  1. python数据表_第1关:了解python数据表操作
  2. html5游戏指尖跟随,图片跟随手指滑动
  3. linux26内核,Linux26内核对象机制研究.pdf
  4. Kittle工具抽取文件出现乱码的情况解决方法
  5. mysql myisam 去掉表锁a_MyISAM表锁的解决方案
  6. 连接数_全国建成5G基站超48万个 5G终端连接数已过亿
  7. java 日历类_JAVA 的日历类型
  8. mysql数据库localhost已断开_完美解决MySQL通过localhost无法连接数据库的问题
  9. solr 查询字段唯一值_《Solr实战》之一
  10. 漫画:程序员相亲?哈哈哈哈哈哈