通过计划任务实现开机自启动
时间:2020-05-16
本文章向大家介绍通过计划任务实现开机自启动,主要包括通过计划任务实现开机自启动使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现原理:
windows系统可以设置计划任务来执行一些定时任务。创建一个计划任务,设置任务的触发条件以及执行操作。将触发条件设置为用户登录,执行操作设置为启动目标程序。这样,程序就可以实现开机自启动功能了。
注意:创建计划任务要求程序必须要有管理员权限。
实现过程:
(1).初始化操作
1.初始化COM接口环境
2.创建任务服务对象ITaskService,并将其链接到任务服务上
3.从ITaskService对象中获取根任务 Root Task Folde r的指针对象ITaskFolder,这个指针指向的是新注册的任务。
(2).创建任务技术
1.创建任务定义对象来创建任务
2.对任务定义对象 ITaskDefinition 进行设置
3.使用 ITaskFolder 对象并利用任务定义对象 ITaskDefinition 的设置,注册任务计划
实现代码:
//CMyTaskSchedule.h #pragma once #include <taskschd.h> #pragma comment(lib, "taskschd.lib") class CMyTaskSchedule { public: CMyTaskSchedule(); ~CMyTaskSchedule(); //************************************ // 函数名: CMyTaskSchedule::NewTask // 返回类型: BOOL // 功能: 创建计划任务 // 参数1: char * lpszTaskName 计划任务名 // 参数2: char * lpszProgramPath 计划任务路径 // 参数3: char * lpszParameters 计划任务参数 // 参数4: char * lpszAuthor 计划任务作者 //************************************ BOOL NewTask(char* lpszTaskName, char* lpszProgramPath, char* lpszParameters, char* lpszAuthor); //************************************ // 函数名: CMyTaskSchedule::Delete // 返回类型: BOOL // 功能: 删除计划任务 // 参数1: char * lpszTaskName 计划任务名 //************************************ BOOL Delete(char* lpszTaskName); private: ITaskService *m_lpITS; ITaskFolder *m_lpRootFolder; };
//CMyTaskSchedule.cpp #include "pch.h" #include "CMyTaskSchedule.h" CMyTaskSchedule::CMyTaskSchedule() { m_lpITS = NULL; m_lpRootFolder = NULL; //初始化COM HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { MessageBox(NULL, L"初始化COM接口环境失败!", L"Error", MB_OK); return; } //创建任务服务对象 hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)(&m_lpITS)); if (FAILED(hr)) { MessageBox(NULL, L"创建任务服务对象失败!", L"Error", MB_OK); return; } //连接到任务服务 hr = m_lpITS->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()); if (FAILED(hr)) { MessageBox(NULL, L"连接到任务服务失败!", L"Error", MB_OK); return; } //获取根任务的指针 //获取Root Task Folder 的指针 ,这个指针指向的是新注册的任务 hr = m_lpITS->GetFolder(_bstr_t("\\"), &m_lpRootFolder); if (FAILED(hr)) { MessageBox(NULL, L"获取根任务的指针失败!", L"Error", MB_OK); return; } } CMyTaskSchedule::~CMyTaskSchedule() { if (m_lpITS) { m_lpITS->Release(); } if (m_lpRootFolder) { m_lpRootFolder->Release(); } // 卸载COM CoUninitialize(); } //创建任务计划 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)) { MessageBox(NULL, L"创建任务失败!", L"Error", MB_OK); return FALSE; } //设置注册信息 IRegistrationInfo *pRegInfo = NULL; CComVariant variantAuthor(NULL); variantAuthor = lpszAuthor; hr = pTaskDefinition->get_RegistrationInfo(&pRegInfo); if (FAILED(hr)) { MessageBox(NULL, L"设置注册信息失败!", L"Error", MB_OK); return FALSE; } // 设置作者信息 hr = pRegInfo->put_Author(variantAuthor.bstrVal); pRegInfo->Release(); // 设置登录类型和运行权限 IPrincipal *pPrincipal = NULL; hr = pTaskDefinition->get_Principal(&pPrincipal); if (FAILED(hr)) { MessageBox(NULL, L"设置登录类型和运行权限失败!", L"Error", MB_OK); 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)) { MessageBox(NULL, L"设置其他信息失败!", L"Error", MB_OK); 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)) { MessageBox(NULL, L"创建执行动作失败!", L"Error", MB_OK); 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(); MessageBox(NULL, L"创建执行动作失败!", L"Error", MB_OK); 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)) { MessageBox(NULL, L"设置触发器信息失败!", L"Error", MB_OK); return FALSE; } // 创建触发器 ITrigger *pTrigger = NULL; hr = pTriggers->Create(TASK_TRIGGER_LOGON, &pTrigger); if (FAILED(hr)) { MessageBox(NULL, L"创建触发器失败!", L"Error", MB_OK); 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(); MessageBox(NULL, L"注册任务计划失败!", L"Error", MB_OK); return FALSE; } pTaskDefinition->Release(); pRegisteredTask->Release(); return TRUE; } //删除计划任务 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; }
原文地址:https://www.cnblogs.com/ndyxb/p/12900127.html
- .Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法
- 机器学习加密货币IOTA在机构支持下跃起
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析
- WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效
- 微信发布了小游戏,这一次腾讯 vs 世界
- .Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决
- 第2章 对象激活上下文-对象激活
- .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
- .Net 转战 Android 4.4 日常笔记(3)--目录结构分析
- .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序
- 读书笔记(二)对象激活和上下文
- 程序员的噩梦有哪些?除了改需求,还有这些…
- UC Berkeley提出新型分布式执行框架Ray:有望取代Spark
- 卡奇话爬虫使用方法以及下载地址
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python Socket TCP双端聊天功能实现过程详解
- django 将自带的数据库sqlite3改成mysql实例
- 利用python对mysql表做全局模糊搜索并分页实例
- PHP chop()函数讲解
- Linux下安装Memcached服务器和客户端与PHP使用示例
- PHP xpath()函数讲解
- CentOS7编译安装php7.1的教程详解
- PHP addcslashes()函数讲解
- 浅谈优化Django ORM中的性能问题
- PHP chr()函数讲解
- iOS音视频接入 - TRTC常见问题
- PHP常见的几种攻击方式实例小结
- PHP strripos函数用法总结
- Laravel5.0+框架邮件发送功能实现方法图文与实例详解
- Ajax+PHP实现的删除数据功能示例