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??
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 🙁
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 🙁
Vielen Dank für deine Hilfe der Code funkt fehlerfrei ich werde ihn adaptieren und umbauen
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 🙁
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.
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 🙁