Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Планировщик задач


Автор: x77 19.4.2006, 14:24
тот, который живёт в Start\Programs\Accessoires\System Tools\Scheduled tasks

требуется вытащить список заданий с параметрами запуска.

бодаюсь уже с неделю. удалось нарыть, что

1) функции netapi32 типа NetScheduleJobEnum не работают.
2) формат файла в Windows\Tasл\*.job - в мсдн не описан и никто его не знает.
3) есть mstask.dll, в которой, насколько я понял, описан некий COM-интерфейс для работы с виндовым планировщиком. в Visual C++ удалось скомпилять и выполнить пример из Platform SDK, который выдал список назначенных заданий. но сам этот интерфейс в системе не зарегестрирован, по крайней мере, создать COM-объект по GUID'у из mstask.h мне не удалось. писать на сях длл-ку, которая будет делать то, что надо, и потом вызывать её - мне тоже не улыбается, потому что получать список тасков мне надо из-под своего DCOM-сервера, и мусорить чужую машину какими-то левыми длл-ками - очень сильно не хочется. зарегестрировать в системе mstask также не удаётся, ни как COM-сервер, ни как библиотеку типов.
4) есть mstask.IDL, который, насколько я понимаю, можно как-то заюзать в дельфях, чтобы получить "свой" ком-объект и работать дальше с ним. если да, то как это делается? эксперименты с idl2pas, midl и протчим успехом не увенчались.

кто-нибудь когда-нибудь решал такую задачу smile? 

Автор: x77 19.4.2006, 14:41
Snowy, если не получится сделать самому - то да, пойдёт. отдам 30 баксов и посмотрю, как умные люди пишут smile спасибо!

а реализовывать эту байду сам никто не пробовал? smile 

Автор: x77 19.4.2006, 15:02
ещё вот нарылась забавная команда. 

schtasks

в крайнем случае можно либо перенаправить вывод пайпами в мемору-стрим какой-нить, либо юзать голый редирект с waitforsingleobject. 

блин, даже в дос это включено! а нормального интерфейса - нету. ненавижу мелкософт.  

Автор: Snowy 19.4.2006, 15:08
Сам не юзал.
(У меня эта дыра в системе вообще вырезается сразу после установки виндов.)
Но, покопавшись в своих закромах, нашел API с демой: 

Автор: Rouse_ 19.4.2006, 15:22
Цитата(x77 @  19.4.2006,  15:24 Найти цитируемый пост)
функции netapi32 типа NetScheduleJobEnum не работают.

Работают, просто они показывают записи по текущему аккаунту планировщика. Без соответствующего переключения он является SYSTEM. Для проверки попробуй создать через планировщик задачу, а потом еще одну но уже из кода программы руками и посмотри на колонку Creator.
Для переключения выполни SetNetScheduleAccountInformation...
Примеров под рукой нет, так что топчи MSDN сам smile 

Автор: x77 19.4.2006, 15:35
Snowy, это оно! спасибо smile


Rouse_, да пробовали, и в дельфи, и в сях. потом вычитали в СДК, что оно локально работать всё равно не будет, и забили на это всё smile 

Автор: x77 19.4.2006, 16:31
короче, вот, вдруг, сгодится кому smile

Код

procedure TForm1.Button1Click(Sender: TObject);
const
  fName: string = '\temp';
var
  pi : TProcessInformation;
  si : TStartupInfo;
begin
  if FileExists (fName) then
    DeleteFile (fName);
  ZeroMemory(@si,sizeof(si));
  si.cb:=SizeOf(si);
  if CreateProcess (PChar('c:\windows\system32\cmd.exe'),
   PChar ('/c schtasks /query /FO csv /v /nh > ' + fName),
   nil, nil, False, 0, nil, nil, si, pi ) then begin
     WaitForSingleObject(pi.hProcess,INFINITE);
     CloseHandle(pi.hProcess);
     CloseHandle(pi.hThread);
     ListBox1.Items.LoadFromFile(fName);
     ListBox1.Items.CommaText := ListBox1.Items.Text;
     DeleteFile (fName);
  end;
end;


 smile  smile  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)