C sharp Externes Programm mit Angabe eines Arbeitsverzeichnisses starten.
Hallo Admins,
erstmal vorneweg: Ich bin ein absoluter Programmier- Noob. Das heißt, ich habe vom Programmieren wirklich gar keine Ahnung und versuch nun trotzdem ein bisschen Code zusammenzustückeln, da ich keine andere Lösung für mein Problem sehe.
Ich werde es Euch kurz schildern. Wir setzen auf einem Windows 2003 Server, welcher uns auch als Printserver dient, einen vom Hersteller unseres ERP- Programms gestrickten Druckerspooler ein. Leider läuft dieses Programm nicht sehr zuverlässig und muss hin und wieder neu gestartet werden. In der Regel, passiert dies wenn ich nicht da bin und dann sollte das Programm von einer Arbeitsstation aus gestartet werden können.
Diese Aufgabenstellung erschien mir anfangs einfach mit einem Tool wie z. B. PSExec, lösbar zu sein. Leider muss beim Programmaufruf aber ein Arbeitsverzeichnis angegeben werden, welches auf einem anderen Server liegt.
Ungefähr so: Programm: C:\Programme\ERP\Druckspooler.exe Arbeitsverzeichnis: W:\Programmverzeichnis\ERP\Datenbankverzeichnis (W: ist eine Freigabe auf einem anderen Server)
Genau an der Tatsache, dass ich auf eine Netzfreigabe wechseln muss, scheitert jeder Versuch, das Programm aus einer Batchdatei heraus aufzurufen. Nun wollte ich versuchen, ein kleines Programm zu erschaffen, welches mir den Aufruf mit samt Arbeitsverzeichnis erledigt. Dazu habe ich im Netz folgenden C# Code gefunden:
using System;
using System.Diagnostics;
namespace Druckspooler_starten
{
class Csharp_Beispiel
{
static void Main(string args)
{Process CPB = new Process();
CPB.StartInfo.FileName = "C:\\programme\\ERP\\Druckspooler.EXE";
CPB.StartInfo.Arguments = "";
CPB.Start();
}
}
}
Ich habe mir den Code an meine Gegebenheiten angepasst und der Aufruf des Programms funktioniert damit auch. Da aber kein Arbeitsverzeichnis angegeben ist, terminiert das Programm mit der Fehlermeldung: Kann Datenbankserver nicht finden.
Also, nun zur Frage: Ist es möglich ein Arbeitsverzeichnis anzugeben und wenn ja, dann wie?
Oder alternativ: Hat Jemand eine andere Idee das Problem zu lösen.
Eine Bitte habe ich dabei: ich würde mich freuen, wenn Ihr bei Euren Antworten darauf achten könntet, dass sie für einen blutigen Anfänger verständlich sind.
Danke schon einmal im Voraus.
Gruß
Enriqe
erstmal vorneweg: Ich bin ein absoluter Programmier- Noob. Das heißt, ich habe vom Programmieren wirklich gar keine Ahnung und versuch nun trotzdem ein bisschen Code zusammenzustückeln, da ich keine andere Lösung für mein Problem sehe.
Ich werde es Euch kurz schildern. Wir setzen auf einem Windows 2003 Server, welcher uns auch als Printserver dient, einen vom Hersteller unseres ERP- Programms gestrickten Druckerspooler ein. Leider läuft dieses Programm nicht sehr zuverlässig und muss hin und wieder neu gestartet werden. In der Regel, passiert dies wenn ich nicht da bin und dann sollte das Programm von einer Arbeitsstation aus gestartet werden können.
Diese Aufgabenstellung erschien mir anfangs einfach mit einem Tool wie z. B. PSExec, lösbar zu sein. Leider muss beim Programmaufruf aber ein Arbeitsverzeichnis angegeben werden, welches auf einem anderen Server liegt.
Ungefähr so: Programm: C:\Programme\ERP\Druckspooler.exe Arbeitsverzeichnis: W:\Programmverzeichnis\ERP\Datenbankverzeichnis (W: ist eine Freigabe auf einem anderen Server)
Genau an der Tatsache, dass ich auf eine Netzfreigabe wechseln muss, scheitert jeder Versuch, das Programm aus einer Batchdatei heraus aufzurufen. Nun wollte ich versuchen, ein kleines Programm zu erschaffen, welches mir den Aufruf mit samt Arbeitsverzeichnis erledigt. Dazu habe ich im Netz folgenden C# Code gefunden:
using System;
using System.Diagnostics;
namespace Druckspooler_starten
{
class Csharp_Beispiel
{
static void Main(string args)
{Process CPB = new Process();
CPB.StartInfo.FileName = "C:\\programme\\ERP\\Druckspooler.EXE";
CPB.StartInfo.Arguments = "";
CPB.Start();
}
}
}
Ich habe mir den Code an meine Gegebenheiten angepasst und der Aufruf des Programms funktioniert damit auch. Da aber kein Arbeitsverzeichnis angegeben ist, terminiert das Programm mit der Fehlermeldung: Kann Datenbankserver nicht finden.
Also, nun zur Frage: Ist es möglich ein Arbeitsverzeichnis anzugeben und wenn ja, dann wie?
Oder alternativ: Hat Jemand eine andere Idee das Problem zu lösen.
Eine Bitte habe ich dabei: ich würde mich freuen, wenn Ihr bei Euren Antworten darauf achten könntet, dass sie für einen blutigen Anfänger verständlich sind.
Danke schon einmal im Voraus.
Gruß
Enriqe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 195945
Url: https://administrator.de/contentid/195945
Ausgedruckt am: 24.11.2024 um 12:11 Uhr
9 Kommentare
Neuester Kommentar
unter CPB.StartInfo.FileName = "C:\\programme\\ERP\\Druckspooler.EXE";
fügst du noch folgende Zeile für das Arbeitsverzeichnis hinzu:
Bitte auf die doppelten Backslashes im Pfad achten !
Das Programm musst du dann aber trotzdem per PSEXEC auf dem Server starten lassen.
Alternativ würde ich ein Programm schreiben, das den Printspooler auf seine Funktion hin auf dem Server überwacht.
Wenn der Prozess einfach nur terminiert wäre es sehr einfach ein Programm zu schreiben das alle paar Minuten überprüft ob der Prozess noch vorhanden ist.
So ist kein Eingriff der Benutzer mehr nötig wenn der Spooler über den Jordan geht.
Wenn du willst bin ich Dir dabei behilflich...
Grüße Uwe
fügst du noch folgende Zeile für das Arbeitsverzeichnis hinzu:
CPB.StartInfo.WorkingDirectory = "W:\\Programmverzeichnis\\ERP\\Datenbankverzeichnis";
Das Programm musst du dann aber trotzdem per PSEXEC auf dem Server starten lassen.
Alternativ würde ich ein Programm schreiben, das den Printspooler auf seine Funktion hin auf dem Server überwacht.
Wenn der Prozess einfach nur terminiert wäre es sehr einfach ein Programm zu schreiben das alle paar Minuten überprüft ob der Prozess noch vorhanden ist.
So ist kein Eingriff der Benutzer mehr nötig wenn der Spooler über den Jordan geht.
Wenn du willst bin ich Dir dabei behilflich...
Grüße Uwe
Hier noch ein Programm das den PrintSpooler Prozess checkt ob dieser vorhanden íst, und wenn nicht diesen startet:
In der Zeile mit : string procName = "Druckspooler"; musst du den Namen des Spooler-Prozesses anpassen( ohne ".exe" am Ende).
Das Programm dann noch mit dem Windows Scheduler auf dem Server alle paar Minuten aufgerufen, fertig.
Das ganze geht natürlich nur wenn der Prozess auch wirklich abschmiert, nicht wenn dieser nur hängt.
In der Zeile mit : string procName = "Druckspooler"; musst du den Namen des Spooler-Prozesses anpassen( ohne ".exe" am Ende).
Das Programm dann noch mit dem Windows Scheduler auf dem Server alle paar Minuten aufgerufen, fertig.
using System;
using System.Diagnostics;
using System.Threading;
namespace MonitorPrintSpooler
{
class Program
{
static void Main(string args)
{
string procName = "Druckspooler";
if (Process.GetProcessesByName(procName).Length < 1)
{
//Starte PrintSpooler
Process ps = new Process();
ps.StartInfo.FileName = "C:\\programme\\ERP\\Druckspooler.EXE";
ps.StartInfo.WorkingDirectory = "W:\\Programmverzeichnis\\ERP\\Datenbankverzeichnis";
ps.Start();
}
}
}
}
Das ganze geht natürlich nur wenn der Prozess auch wirklich abschmiert, nicht wenn dieser nur hängt.
Mit eingebundenen Netzlaufwerken ist das so eine Sache. Diese sind immer nur für den jeweiligen Bneutzer verbunden und nicht Systemweit. D.h.unter dem Account mit den Login-Daten mit denen du psexec ausführst müssen muss das Netzlaufwerk eingebunden sein. Eventuell musst du noch den PSEXEC Parameter zum Laden des Profils aktivieren damit das Netzlaufwerk in dessen Kontext verfügbar ist, hab den grad nicht im Kopf. Mach mal psexec -?.
Aber meine zweite Lösung würde ich Dir sowieso empfehlen. So braucht niemand eingreifen und alles geht automatisch.
Grüsse Uwe
Aber meine zweite Lösung würde ich Dir sowieso empfehlen. So braucht niemand eingreifen und alles geht automatisch.
Grüsse Uwe