zoukankan      html  css  js  c++  java
  • 通过计划任务实现开机自启动

    实现原理:

      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;
    }
  • 相关阅读:
    POJ 2991(线段树)
    UVa_1592
    紫书 -- 大整数类
    在结构体中添加成员函数/C++
    双向队列
    用埃氏筛法生成质数表
    poj 3687(拓扑排序)
    它们其实都是“图”-- 最小生成树
    最小生成树(MST, Minimum Spanning Tree)
    他们其实都是“图”--最短路
  • 原文地址:https://www.cnblogs.com/ndyxb/p/12900127.html
Copyright © 2011-2022 走看看