AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SYSTEM_REQUIRED Flag im TaskScheduler setzen.
Thema durchsuchen
Ansicht
Themen-Optionen

SYSTEM_REQUIRED Flag im TaskScheduler setzen.

Ein Thema von Xanadu · begonnen am 3. Jul 2005 · letzter Beitrag vom 3. Jul 2005
Antwort Antwort
Xanadu

Registriert seit: 8. Mai 2005
Ort: Schwäbisch Gmünd
20 Beiträge
 
Delphi 5 Enterprise
 
#1

SYSTEM_REQUIRED Flag im TaskScheduler setzen.

  Alt 3. Jul 2005, 16:38
Hi, hab noch ein Problemchen mit dem TaskScheduler.

Zwar gibt es zwei Beitäge zu dem Thema allgemein bei Euch Geplanten Task in Windows erstellen und Programm in geplante Tasks eintragen aber die decken mein Problem nicht ab.

Ich habe die JEDI MsTask.pas bzw. Christian Ruocco´s TaskSched.pas eingebunden und kann auch Tasks anlegen. Allerdings wird das Flag: TASK_FLAG_SYSTEM_REQUIRED nicht gesetzt. Das bedeutet der Task wird nicht ausgeführt weil in den Task-Eigenschaften im Reiter: "Einstellungen" bei der "Energieverwaltung" die Option: "Computer zum Ausführen des Tasks reaktivieren" nicht markiert ist. Das krieg ich im Coding nicht hin.

Ausserdem kann ich auch keinen abweichenden Account via Task.SetAccountInformation angeben. Die Funktionen laufen zwar beim Debuggen fehlerfrei und liefern auch die richtigen Rückgabewerte, aber im Task ist nichts drin. Wenn ich nachher manuell mit Task.Edit rein gehe kann ich´s allerdings setzen und auch speichern. Dann tut es auch sauber.

Weil ich über mein Programm jede Menge Videoaufnahmen über ein Derrivat der TV_Movie Datenbank time ist das manuelle Checken nervig weil mit nem Hauffen clicks verbunden.

Ich vermute mal ich hab was ganz banales übersehen und vermute auch dass beide Probleme die gleiche Ursache haben könnten, bräuchte aber dennoch einen Insider-Tipp.

Mein Coding ist:
Delphi-Quellcode:
        Task:= Sched.Tasks.Add('DVB_' + IntToStr(FieldValues['ID']));
        Task.AppName:= '"' + sWorkDir + '\' + sAppName + '"';
        Task.Parameters:= ' /1 ' + tblSenderCodes.FieldValues['SenderCode']
          + ' "' + sRecDir + FieldValues['Title'] + '.mpg" MPG '
          + IntToStr((Hour * 60) + Min) + ' Stop 3000MB';

        // bis hier tut alles!

        Task.SystemRequired:= True; // tut nicht, fehlert aber auch nicht!
        Task.SetAccount(edtAccount.Text,edtPWD.Text); // tut nicht, fehlert aber auch nicht!

        // ab hier tut´s auch wieder!

        Trigger:= Task.Triggers.Add;
        Trigger.HasEndDate:= False;
        Trigger.Kind:= tskOnce;
        Trigger.StartTime:= FieldValues['StartTime'];
        Trigger.Enabled:= true;

        // bis hier ist´s auch wieder okay!

        Trigger.SystemRequired:= True; // tut nicht, fehlert aber auch nicht!

        // und ab hier klappt es dann auch!

        Trigger.Save;
        Task.Edit; // wenn ich hier manuell ändere funktioniert es.
Weil mein Video-PC eine eigenständige Maschine im heimatlichen Netz ist und als Pentium-II Rechner nicht die richtige Performance für Datenbankselects hat time ich auf einem anderen Rechner. Deshalb brauch ich auch den abweichenden Account den ich in der TaskSched.pas wie folgt implementiert habe:
Delphi-Quellcode:
function TTaskSchedulerTask.SetAccount(AccountName, PWD: string): boolean;
var
  PAccount: Array[0..64] of WideChar;
  PPWD: Array[0..64] of WideChar;
  hr: HRESULT;
begin
  hr:= GetITask.SetAccountInformation(StringToWideChar(AccountName, PAccount, length(AccountName)+1), StringToWideChar(PWD,PPWD, Length(PWD)+1));
  if hr = S_OK then
    Result:= True
  else
  begin
    Result:= False;
    case hr of
      E_ACCESSDENIED: ShowMessage('Fehler: Sie besitzen nicht genügend Rechte für diese Operation!');
      E_INVALIDARG: ShowMessage('Fehler: Die übergebenen Argumente sind ungültig!');
      E_OUTOFMEMORY: ShowMessage('Fehler: Nicht genügend Speicher verfügbar!');
      SCHED_E_NO_SECURITY_SERVICES: ShowMessage('Fehler: Security Services nicht unter Win9.x verfügbar!');
      SCHED_E_UNSUPPORTED_ACCOUNT_OPTION: ShowMessage('Fehler: TASK_FLAG_RUN_ONLY_IF_LOGGED_ON nicht gesetzt! (PWD: NIL)');
      SCHED_E_ACCOUNT_INFORMATION_NOT_SET: ShowMessage('Fehler: ungültiges Passwort!');
    else
      ShowMessage('unbekannter Fehler!');
    end;
  end;
end;
Habe in der TaskSched.pas auch das Flag setzen auf dem TTask statt nur im TTrigger rein gebastelt, hilft aber auch nix obwohl ich true zurück krieg:
Delphi-Quellcode:
function TTaskSchedulerTask.GetSystemRequired : Boolean;
var
  Flags : DWORD;
begin
  GetITask.GetTaskFlags(Flags);
  Result := (Flags and TASK_FLAG_SYSTEM_REQUIRED) = 0;
end;

procedure TTaskSchedulerTask.SetSystemRequired(Value : Boolean);
var
  Flags : DWORD;
  iiTask : ITask;
begin
  iiTask := GetITask;

  iiTask.GetTaskFlags(Flags);

  if not Value then
    Flags := Flags or TASK_FLAG_SYSTEM_REQUIRED
  else
    Flags := Flags and (not TASK_FLAG_SYSTEM_REQUIRED);

  iiTask.SetTaskFlags(Flags);
  Tasks.ISave(iiTask);
end;

Würde mich freuen wenn jemand ne Hilfe geben könnte.

Gruß, Bernd
  Mit Zitat antworten Zitat
3. Jul 2005, 16:41
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Windows API / MS.NET Framework API" verschoben.
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 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