С++ Создание задачи, выполняемой при загрузке системы
В данном примере создаётся задача, выполняемая при загрузке ПК, которая запускает указанное приложение. RegisterTaskDefinition возвращает E_ACCESSDENIED при запуске от имени обычного пользователя. Если запустить от имени администратора, всё работает без ошибок. Получается нельзя создавать задачи, выполняемые при включении компьютера, без разрешения администратора? Может быть в представленном примере есть ошибки или есть другой способ создания задачи автозапуска без запроса прав?
CComPtr<ITaskService> pTaskService;
CHECK_HR(pTaskService.CoCreateInstance(__uuidof(TaskScheduler)));
CHECK_HR(pTaskService->Connect(CComVariant(),
CComVariant(),
CComVariant(),
CComVariant()));
CComPtr<ITaskFolder> pRootTaskFolder;
CHECK_HR(pTaskService->GetFolder(CComBSTR(L"\\"), &pRootTaskFolder));
CComPtr<ITaskDefinition> pTaskDef;
CHECK_HR(pTaskService->NewTask(0, &pTaskDef));
CComPtr<ITaskSettings> pTaskSettings;
CHECK_HR(pTaskDef->get_Settings(&pTaskSettings));
CHECK_HR(pTaskSettings->put_DisallowStartIfOnBatteries(VARIANT_FALSE));
CHECK_HR(pTaskSettings->put_ExecutionTimeLimit(CComBSTR("PT0S")));
CHECK_HR(pTaskSettings->put_AllowDemandStart(VARIANT_FALSE));
CHECK_HR(pTaskSettings->put_Hidden(VARIANT_TRUE));
CComPtr<ITriggerCollection> pTriggers;
CHECK_HR(pTaskDef->get_Triggers(&pTriggers));
CComPtr<ITrigger> pTrigger;
CHECK_HR(pTriggers->Create(TASK_TRIGGER_BOOT, &pTrigger));
CComPtr<IActionCollection> pActions;
CHECK_HR(pTaskDef->get_Actions(&pActions));
CComPtr<IAction> pAction;
CHECK_HR(pActions->Create(TASK_ACTION_EXEC, &pAction));
CComQIPtr<IExecAction> pExecAction(pAction);
CHECK_HR(pExecAction->put_Path(CComBSTR(lpAppName)));
CHECK_HR(pExecAction->put_WorkingDirectory(CComBSTR(lpWorkingDir)));
CComPtr<IRegisteredTask> pRegisteredTask;
HRESULT hr = pRootTaskFolder->RegisterTaskDefinition(CComBSTR(lpTaskName),
pTaskDef, TASK_CREATE_OR_UPDATE,
CComVariant(),
CComVariant(),
TASK_LOGON_INTERACTIVE_TOKEN,
CComVariant(),
&pRegisteredTask);
CHECK_HR(hr);
Ответы (1 шт):
Создание задачи для автозапуска программы при загрузке компьютера требует прав администратора, но можно создать задачу без запроса прав: регистрация приложения как службы Windows с помощью функций WinAPI (CreateService, StartService) или командной строки.
Приведу пример, нам надо, чтобы при запуске системы у нас запускалось приложение в определенной папке:
Сначала откроем менеджер служб Windows и пропишем
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
Потом создадим новую службу в системе
SC_HANDLE hService = CreateService(hSCManager,
TEXT("MyService"), // Имя службы
TEXT("My Service Description"), // Описание службы
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
TEXT("C:\\Path\\To\\MyApp.exe"), // Путь к приложению
NULL,
NULL,
NULL,
NULL,
NULL);
И в конце концов запустим службу
StartService(hService, 0, NULL);
Теперь при каждом запуске системы, у нас будет открываться программа, приложение или игра по пути C:\Path\To\MyApp.exe.