Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Geplanter Task startet nicht (https://www.delphipraxis.net/59526-geplanter-task-startet-nicht.html)

mumu 23. Dez 2005 14:56


Geplanter Task startet nicht
 
wenn ich einen task mit delphi erstelle, dann lässt er sich nicht ausführen. dabei ist es egal, ob der startzeitpunkt für den task gekommen ist oder ob ich ihn manuell ausführen will. das gewünschte programm wird definitiv nicht gestartet. wenn ich jetzt die eigenschaften des tasks öffne und einen haken hin und wieder weg nehm (also so dass eigentlich keine einstellung geändert wurde) und dann auf ok klicke, dann funktioniert der task ohne probleme.

so erzeuge ich den task:

Delphi-Quellcode:
var
  HR                 : HRESULT;
  WorkItem           : IUnknown;
  gCTask             : TIID;
  gIScheduledWorkItem : TIID;
  ScheduledWorkItem  : IScheduledWorkItem;
  pIPersistFile      : IPersistFile;
  piNewTrigger       : Word;
  ITTrigger          : ITaskTrigger;
  TaskTrig           : TTaskTRIGGER;
begin
  gCTask := CLSID_CTask;
  gIScheduledWorkItem := IID_IScheduledWorkItem;

  HR := SchedulingAgent.NewWorkItem(StrToWide(backup_name), gCTask,
    gIScheduledWorkItem, WorkItem);

  Task := ITask(WorkItem); //required for save
  ScheduledWorkItem := IScheduledWorkItem(WorkItem);
  if HR = S_OK then
  begin
    Task.SetApplicationName(StrToWide(Globals.CurrentDir + 'StartBackup.exe'));
    Task.SetWorkingDirectory(StrToWide(Globals.CurrentDir));
    Task.SetParameters(StrToWide('"Start_Job=' + GuidToString(_id)+'"'));
    Task.SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
  end;

  HR := Task.CreateTrigger(piNewTrigger, ITTrigger);
  if HR = S_OK then
  begin
    ZeroMemory(@TaskTrig, sizeof(TASK_TRIGGER));
    TaskTrig.cbTriggerSize := sizeof(TASK_TRIGGER);
    TaskTrig.Reserved1 := 0;
    TaskTrig.Reserved2 := 0;

    DecodeDateTime(_uhrzeit, Year, Month, Day, Hour, Min, Sec, mSec);
    TaskTrig.wStartHour := Hour;
    TaskTrig.wStartMinute := Min;

    DecodeDateTime(Now, Year, Month, Day, Hour, Min, Sec, mSec);
    TaskTrig.wBeginYear := Year;
    TaskTrig.wBeginMonth := Month;
    TaskTrig.wBeginDay := Day;
    TaskTrig.wEndYear := 0;
    TaskTrig.wEndMonth := 0;
    TaskTrig.wEndDay := 0;

    TaskTrig.MinutesDuration := 0;
    TaskTrig.MinutesInterval := 0;
    TaskTrig.rgFlags := 0;
    TaskTrig.wRandomMinutesInterval := 0;

    TaskTrig.TriggerType := TASK_TIME_TRIGGER_DAILY;

    TaskTrig.Type_.Daily.DaysInterval := _Tag;

    hr := ITTrigger.SetTrigger(@TaskTrig);
    if (hr <> S_OK) then
    begin
      MessageBox(0, pchar(MessageFromValue(hr)), 'Fehler', MB_ICONINFORMATION);
      exit;
    end;
  end;

  Task.QueryInterface(IID_IPersistFile, pIPersistFile);
  if pIPersistFile <> nil then
  begin
    pIPersistFile.Save(nil, true);
  end;

mumu 23. Dez 2005 16:31

Re: Geplanter Task startet nicht
 
mir ist aufgefallen, dass der task nur funktioniert, wenn man den haken in der checkbox "Nur aktivieren, wenn angemeldet" entfernt und gleich danach wieder hinzufügt. oder wenn man vom pfad ein zeichen entfernt und gleich wieder hinmacht. Nach einem klick auf ok geht der task dann.

bei anderen checkboxen wird irgendwie der task nicht richtig durch windows aktualisiert und deshalb funktioniert der auch nach einem klick auf ok nicht.

mumu 27. Dez 2005 10:21

Re: Geplanter Task startet nicht
 
hmm keiner ne idee? soll ich das programm vielleicht mal anhängen?

mumu 2. Jan 2006 12:36

Re: Geplanter Task startet nicht
 
ich habs jetzt rausgefunden, voran es lag.

mein konto hatte kein kennwort, daher konnte der Geplante Task nicht ausgeführt werden:
siehe msdn

meiner meinung ist das ein witz, dass microsoft hier sagt, its not a bug, its a feature. wenn dem doch schon so ist, warum dann keine fehlermeldung???? so sucht man sich ja zu tode.

meine frage jetzt: kann ich den task auch irgendwie unter einem System Konto ausführen, so dass das Benutzerkonto kein Passwort braucht? welchen benutzernamen und welches password soll ich dann da angeben?

mumu 23. Jan 2006 12:28

Re: Geplanter Task startet nicht
 
jemand ne idee?

berens 3. Feb 2011 11:30

AW: Geplanter Task startet nicht
 
Mir klar, dass die Problemstellung schon lange her ist, aber da ich eben selbst lange vor dem Problem gehangen habe, für die Nachwelt:

Ohne Benutzername / Passwort wird der Task in Windows (Windows 7 Pro) zwar angelegt, aber weder Auslöser (Wochentag / Uhrzeit, ...) noch Aktion (Programm das gestartet wird) werden eingetragen.

Durch hinzufügen von
Task.AccountName := LocalSystemAccount;
oder Task.AccountName := 'SYSTEM';

vor z.B. die Zeile HR := Task.CreateTrigger(piNewTrigger, ITTrigger); klappt das erstellen (zumindest bei mir) einwandfrei, solange der Benutzer später zur Laufzeit als Administrator das Programm ausführt (stichwort Windows 7 Manifest, UAC und so weiter).

PS/Edit: Naja, das betrifft zumindest TJclScheduledTask . Ob das hier mit den Interfaces auch direkt zutrifft, weiß ich nicht. LocalSystemAccount ist übrigens eine String-Const mit dem Wert 'SYSTEM'. Laut M$ muss Benutzername und Passwort für den Task NIL oder '' sein, damit der SYSTEM - Account verwendet wird. TJclScheduledTask setzt die Werte entsprechend, wenn man "System" als Benutzernamen übergibt.

Memnarch 3. Feb 2011 11:58

AW: Geplanter Task startet nicht
 
Herzlichen dank :)

Wird sicher einigen Hilfreich sein.

MFG
Memnarch


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz