Пожалуйста, обратите внимание, что пользователь заблокирован
В общем-то, был в поисках актуального метода закрепа в системе. CurrentVersion\Run(Once) такая себе затея, решил попробовать через планировщик закрепиться.
Но, как оказалось, без админ-прав задание не создать, хотя если создавать через schtasks.exe - можно и из-под юзера.
P.S советую обратить внимание на COM Hijaking.
Но, как оказалось, без админ-прав задание не создать, хотя если создавать через schtasks.exe - можно и из-под юзера.
C:
HRESULT SetStartupTask(LPCWSTR path, LPCWSTR taskName)
{
HRESULT hRes = S_OK;
ITaskService* taskService = nullptr;
ITaskFolder* taskFolder = nullptr;
ITaskDefinition* taskDef = nullptr;
IActionCollection* actions = nullptr;
ITriggerCollection* triggers = nullptr;
IRegisteredTask* task = nullptr;
do
{
hRes = CoInitialize(nullptr,);
if (FAILED(hRes)) break;
hRes = CoCreateInstance(CLSID_TaskScheduler, nullptr, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)&taskService);
if (FAILED(hRes)) break;
hRes = taskService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());
if (FAILED(hRes)) break;
hRes = taskService->GetFolder(_bstr_t(L"\\"), &taskFolder);
if (FAILED(hRes)) break;
hRes = taskService->NewTask(0, &taskDef);
if (FAILED(hRes)) break;
hRes = taskDef->get_Actions(&actions);
if (SUCCEEDED(hRes))
{
IAction* action = nullptr;
hRes = actions->Create(TASK_ACTION_EXEC, &action);
if (SUCCEEDED(hRes))
{
IExecAction* execAction = nullptr;
hRes = action->QueryInterface(IID_IExecAction, (void**)&execAction);
if (SUCCEEDED(hRes))
{
hRes = execAction->put_Path(_bstr_t(path));
execAction->Release();
}
action->Release();
}
actions->Release();
}
hRes = taskDef->get_Triggers(&triggers);
if (SUCCEEDED(hRes))
{
ITrigger* trigger = nullptr;
hRes = triggers->Create(TASK_TRIGGER_LOGON, &trigger);
if (SUCCEEDED(hRes))
{
ILogonTrigger* logonTrigger = nullptr;
hRes = trigger->QueryInterface(IID_ILogonTrigger, (void**)&logonTrigger);
if (SUCCEEDED(hRes))
{
hRes = logonTrigger->put_Id(_bstr_t(L"Default"));
logonTrigger->Release();
}
trigger->Release();
}
triggers->Release();
}
hRes = taskFolder->RegisterTaskDefinition(_bstr_t(taskName), taskDef, TASK_CREATE_OR_UPDATE, _variant_t(), _variant_t(), TASK_LOGON_INTERACTIVE_TOKEN, _variant_t(), &task);
} while (FALSE);
if (taskService) taskService->Release();
if (taskFolder) taskFolder->Release();
if (taskDef) taskDef->Release();
if (task) task->Release();
CoUninitialize();
return hRes;
}
P.S советую обратить внимание на COM Hijaking.