С++ Создание задачи, выполняемой при загрузке системы

Рейтинг: 0Ответов: 1Опубликовано: 05.06.2023

В данном примере создаётся задача, выполняемая при загрузке ПК, которая запускает указанное приложение. 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);

Ответы

▲ -3

Создание задачи для автозапуска программы при загрузке компьютера требует прав администратора, но можно создать задачу без запроса прав: регистрация приложения как службы 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.