java通过麒麟实现开机自启动_通过计划任务实现开机自启动

本文介绍了如何使用Java在麒麟操作系统上创建开机自启动任务。通过C++代码展示了如何利用COM接口连接任务调度服务,创建任务定义,设置登录类型和运行权限,以及配置触发器来实现在用户登录时启动指定程序。
摘要由CSDN通过智能技术生成

//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)

{returnFALSE;

}//如果存在相同的计划任务,则删除

Delete(lpszTaskName);//创建任务定义对象来创建任务

ITaskDefinition *pTaskDefinition =NULL;

HRESULT hr= m_lpITS->NewTask(0, &pTaskDefinition);if(FAILED(hr))

{

MessageBox(NULL, L"创建任务失败!", L"Error", MB_OK);returnFALSE;

}//设置注册信息

IRegistrationInfo *pRegInfo =NULL;

CComVariant variantAuthor(NULL);

variantAuthor=lpszAuthor;

hr= pTaskDefinition->get_RegistrationInfo(&pRegInfo);if(FAILED(hr))

{

MessageBox(NULL, L"设置注册信息失败!", L"Error", MB_OK);returnFALSE;

}//设置作者信息

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);returnFALSE;

}//设置登录类型

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);returnFALSE;

}//设置其他信息

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);returnFALSE;

}

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);returnFALSE;

}

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);returnFALSE;

}//创建触发器

ITrigger *pTrigger =NULL;

hr= pTriggers->Create(TASK_TRIGGER_LOGON, &pTrigger);if(FAILED(hr))

{

MessageBox(NULL, L"创建触发器失败!", L"Error", MB_OK);returnFALSE;

}//注册任务计划

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);returnFALSE;

}

pTaskDefinition->Release();

pRegisteredTask->Release();returnTRUE;

}//删除计划任务

BOOL CMyTaskSchedule::Delete(char*lpszTaskName)

{if(NULL ==m_lpRootFolder)

{returnFALSE;

}

CComVariant variantTaskName(NULL);

variantTaskName=lpszTaskName;

HRESULT hr= m_lpRootFolder->DeleteTask(variantTaskName.bstrVal, 0);if(FAILED(hr))

{returnFALSE;

}returnTRUE;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值