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