Laden...

Windows Service / Geplante Tasks

Erstellt von King vor 17 Jahren Letzter Beitrag vor 16 Jahren 3.769 Views
K
King Themenstarter:in
27 Beiträge seit 2006
vor 17 Jahren
Windows Service / Geplante Tasks

Hi Leute!

Ich bräuchte mal kurz eure Hilfe. Ich habe ein einfaches Programm geschrieben welches ich in Windows unter geplante Tasks eingefügt habe. Bei den geplanten Tasks kann man das Datum einstellen, wann es ausgeführt werden soll. Soweit so gut.

Jetzt will ich ein zusätzlichen Dienst/Windows Service welches beim start gestartet wird schreiben was ja keine Schwierigkeiten macht und dann damit auf die Geplanten Tasks zugreifen.

Mein Problem ist jedoch folgendes. Ich möchte aus dem Dienst auf die Geplanten Tasks zugreifen können und dort das Datum umändern, so dass das Programm vorher wöchentlich war und es halt auf Täglich umstellen.

Könnt ihr mir da weiter Helfen wie und wo ich auf die Geplanten Tasks zugreifen muss bzw. wo das abgespeichert ist und wo ich das ändern kann??

1.820 Beiträge seit 2005
vor 17 Jahren

Hallo!

Eine Alternative wäre die Verwendung des Kommandozeilen-Tools "at.exe".
Es gibt aber auch eine API für den Scheduler, hab' aber keine Infos darüber. Evtl. geht's auch mit WMI?

Edit: Veralteten Link gelöscht

Nobody is perfect. I'm sad, i'm not nobody 🙁

1.820 Beiträge seit 2005
vor 17 Jahren

Hallo!

Insgesamt scheint es 4 Methoden in der "netapi32.dll" zu geben, womit man den Scheduler steuern kann:
*NetScheduleJobAdd *NetScheduleJobDel *NetScheduleJobEnum *NetScheduleJobGetInfo

In der MSDN steht hier noch mehr dazu (suche nach NetSchedule).

Hier mal ein wenig Code, um einen neuen Task zu erstellen (ungetestet):


using System;
using System.Runtime.InteropServices;

 [StructLayout(LayoutKind.Sequential)]
 public struct AT_INFO
 {
  public uint JobTime;// Uhrzeit
  public uint DaysOfMonth;// Welche Wochentage
  public byte DaysOfWeek;// Welche Monatstage
  public byte Flags;// Zusätzliche Einstellungen
  [MarshalAs(UnmanagedType.LPTStr)]
  public string Command;// Auszuführender Befehl
 }

  class Tester
 {
    private const int JOB_RUN_PERIODICALLY = 0x01;
    private const int JOB_EXEC_ERROR = 0x02;
    private const int JOB_RUNS_TODAY = 0x04;
    private const int JOB_ADD_CURRENT_DATE = 0x08;
    private const int JOB_NONINTERACTIVE = 0x10;

 [DllImport("netapi32.dll", EntryPoint="NetScheduleJobAdd",
SetLastError=true)]
  public static extern int NetScheduleJobAdd(string ServerName, IntPtr
Buffer, ref int jobId);

  static void Main()
  {
   int result = 0;
   int jobId = 0;
   IntPtr ptr = IntPtr.Zero;
   AT_INFO ai = new AT_INFO();
   ai.JobTime = 16 * 60 * 60 *1000;
   ai.DaysOfMonth = 0x4000000;
   ai.DaysOfWeek = 0;
   ai.Flags = JOB_NONINTERACTIVE;
   ai.Command = "notepad.exe";
   ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ai));
   Marshal.StructureToPtr(ai, ptr, true);
   result = NetScheduleJobAdd(null, ptr, ref jobId);
   if (result == 0)
   {
    Console.WriteLine("Job: {0}", jobId);
   }
   else
    Console.WriteLine("Error return: {0}",result);
  }
 } 

Nobody is perfect. I'm sad, i'm not nobody 🙁

K
King Themenstarter:in
27 Beiträge seit 2006
vor 17 Jahren

Vielen Dank für deine Hilfe der Code funkt fehlerfrei ich werde ihn adaptieren und umbauen

1.820 Beiträge seit 2005
vor 17 Jahren

Hallo!

Wenn dein Programm funktioniert, könntest du evtl. die Lösung hier kurz beschreiben, da deine Frage bei mir ziemliches Interesse geweckt hat.

Nobody is perfect. I'm sad, i'm not nobody 🙁

K
King Themenstarter:in
27 Beiträge seit 2006
vor 17 Jahren

Kein Problem aber ich werde noch bischen Zeit brauchen bis ichs fertig habe muss derzeit noch andere sachen machen in ca. einer Woche kann ich dir dann den Code raufhauen sollte sich ausgehen.

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

Für alle interessierten hier noch ein paar weitere Lösungsansätze:

Es gibt u.a. ein Projekt unter CodeProject, welches sich mit derselben Problematik befasst.

Nobody is perfect. I'm sad, i'm not nobody 🙁