Itaskscheduler запуск от system

добрый день! пишу приложение, которое пользуется стандартным виндусовским шедулером. создание задания делается следующим образом:
procedure AddJob(timeout : TTimeOut);
 var WorkItem, PITask : IUnknown;
 piNewTrigger, tWord : Word;
 ITTrigger : ITaskTrigger;
 TaskTrig : TTaskTRIGGER;
 uname, pass : PWideChar;
 SchedulingAgent: ITaskScheduler;
 ScheduledWorkItem: IScheduledWorkItem;
 pIPersistFile: IPersistFile;
 Task: ITask;
 DT : TDateTime;
 formDT : string;
 param : string;
 i : integer;
 ParamFile : TIniFile;
begin
 if ParamFile.ReadInteger('Param', 'RunNextJob', 0)=1 then
 begin
 // if ActiveX.CoInitialize(nil) <> S_OK then raise Exception.Create('');
 ActiveX.CoCreateInstance(CLSID_CSchedulingAgent, nil, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, SchedulingAgent);
 tWord:=0;
 // задание с таким именем существует?
 Task := nil;
 if SchedulingAgent.Activate(StrToWide('mytask'), IID_ITask, PITask) = S_OK then Task := ITask(PITask);
 if Task <> nil then SchedulingAgent.Delete(StrToWide('mytask'));
 // заносим имя задания
 SchedulingAgent.NewWorkItem(WideString('mytask'), CLSID_CTask, IID_IScheduledWorkItem, WorkItem);
 Task := ITask(WorkItem);
 ScheduledWorkItem := IScheduledWorkItem(WorkItem);
 // запуск программы
 Task.SetApplicationName(PWideChar(Application.ExeName));
 // параметры запуска программы
 Task.SetParameters(PWideChar(param));
 // рабочая директория
 Task.SetWorkingDirectory(PWideChar(ExtractFileDir(Application.ExeName)));
 // комментарии
 Task.SetComment(WideString('комментарий для задания'));
 // устанавливаем акаунт юзера (имя, пароль пользователя)
 GetMem(uname, 255);
 GetMem(pass, 255);
 StringToWideChar('user', uname, Length('user') + 1); //!!!
 StringToWideChar('pass', pass, Length('pass') + 1); //!!!
 Task.SetAccountInformation(uname, pass);
 FreeMem(uname);
 FreeMem(pass);
 // устанавливаем с какого времени выполнять задание
 Task.CreateTrigger(piNewTrigger, ITTrigger);
 ZeroMemory(@TaskTrig, sizeof(TASK_TRIGGER));
 TaskTrig.cbTriggerSize := sizeof(TASK_TRIGGER);
 TaskTrig.wEndYear := 0;
 TaskTrig.wEndMonth := 0;
 TaskTrig.wEndDay := 0;
 DT := Now;
 DT := DT + (1/(24*60)) * 10; //ждем 10 минут
 TaskTrig.wStartHour := HourOf(DT);
 TaskTrig.wStartMinute := MinuteOf(DT);
 TaskTrig.wBeginYear := YearOf(DT);
 TaskTrig.wBeginMonth := MonthOf(DT);
 TaskTrig.wBeginDay := DayOf(DT);
 // тип запуска однократно
 TaskTrig.TriggerType:=TASK_TIME_TRIGGER_ONCE;
 ITTrigger.SetTrigger(@TaskTrig);
 // сохраняем
 Task.**************(IID_IPersistFile, pIPersistFile);
 if pIPersistFile <> nil then pIPersistFile.Save(nil, true);
 end
 ParamFile.Free;
end;
подскажите, как мне реализовать запуск не от имени user/pass, а от имени system (системной учетной записи)?
3 ответа

Запускать из службы или планировщика


Запускать из службы или планировщика
а как это можно программно реализовать? специфика приложения такая, что оно запускается, делает часть работы, создает задание по вызову себя через некоторое время и терминейтится. и нужно это делать от system


Просто пишите приложение-службу, и из неё все делаете. File - New - Service Application и в путь.