Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2013, 18:38   #1
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию 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.QueryInterface(IID_IPersistFile, pIPersistFile);
    if pIPersistFile <> nil then pIPersistFile.Save(nil, true);
  end
  ParamFile.Free;
end;
подскажите, как мне реализовать запуск не от имени user/pass, а от имени system (системной учетной записи)?

Последний раз редактировалось Bayazet; 02.10.2013 в 18:41.
Bayazet вне форума Ответить с цитированием
Старый 02.10.2013, 18:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Запускать из службы или планировщика
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.10.2013 в 18:44.
Аватар вне форума Ответить с цитированием
Старый 02.10.2013, 18:52   #3
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

Цитата:
Запускать из службы или планировщика
а как это можно программно реализовать?
специфика приложения такая, что оно запускается, делает часть работы, создает задание по вызову себя через некоторое время и терминейтится. и нужно это делать от system
Bayazet вне форума Ответить с цитированием
Старый 02.10.2013, 18:57   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Просто пишите приложение-службу, и из неё все делаете.
File - New - Service Application и в путь.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Ambiguity between '_fastcall System::operator +(int,const System::Variant &)' and '_fastcall System::opera Jawner C++ Builder 1 12.04.2012 09:58
Ошибка Unresolved external 'AVIA::AVIA(int, System::AnsiString, System::AnsiString, System::AnsiString, int) mexmexmex C++ Builder 3 27.12.2011 13:31
Команда System: запуск программы в свёрнутом режиме, Не работает команда /min Me777 Общие вопросы C/C++ 0 12.07.2011 11:49
System of a down crazy horse Свободное общение 11 17.03.2011 00:39
System.Net и System.Net.Sockets Adwenturer Общие вопросы .NET 4 08.02.2010 22:08