enriqe
Goto Top

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

Content-ID: 195945

Url: https://administrator.de/contentid/195945

Ausgedruckt am: 24.11.2024 um 12:11 Uhr

colinardo
colinardo 17.12.2012 aktualisiert um 13:21:57 Uhr
Goto Top
unter CPB.StartInfo.FileName = "C:\\programme\\ERP\\Druckspooler.EXE";
fügst du noch folgende Zeile für das Arbeitsverzeichnis hinzu:
CPB.StartInfo.WorkingDirectory = "W:\\Programmverzeichnis\\ERP\\Datenbankverzeichnis";  
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
colinardo
colinardo 17.12.2012 aktualisiert um 14:29:45 Uhr
Goto Top
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.
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.
Enriqe
Enriqe 18.12.2012 um 10:53:50 Uhr
Goto Top
Hallo Softmeister,

eben lese ich Deine Vorschläge zur Lösung meines Problems. Noch habe ich sie nicht ausprobieren können, möchte mich jedoch gleich bedanken für die schnelle und leicht verständliche Antwort.
Find ich SUPER!!!
Ich werde Dich über das Ergebnis auf dem Laufenden halten und vielleicht tauchen ja auch neue Fragen auf.
Vielen Dank auf jeden Fall

Gruß
Enriqe
Enriqe
Enriqe 18.12.2012 um 13:16:12 Uhr
Goto Top
Hallo Softmeister,

also, lokal ausgeführt startet das C# Programm mit der Angabe des Arbeitsverzeichnisses im Code. Super.
Was ich allerdings nicht verstehe ist, dass wenn ich das C# Programm remote über PSexec aufrufe, dann bekomme ich zwar in der Konsole ein errorcode 0 zurück und ich sehe am Zielsystem auch im Taskmanager den Task auftauchen aber das Spooler- Programm (frontend) startet nicht. Es müsste ein Symbol im Systray auftauchen über welches ich mir z. B. den Monitor anzeigen lassen kann. Das kommt nur, wenn ich das C# Programm lokal aufrufe. Fehler bekomme ich keine.
Den Code zum überwachen und neustarten des Spoolers, sollte der nicht mehr laufen, habe ich noch nicht angepasst. Das werde ich als nächstes tun.

Vielen Dank noch einmal und vielleicht hast Du ja eine Idee, warum der Aufruf remote anders sein könnte als lokal.
colinardo
colinardo 18.12.2012 um 13:22:16 Uhr
Goto Top
Du musst in PSEXEC mit dem Parameter "-i" explizit angeben das das Programm in der Console-Session auf dem Server interaktiv(also mit Benutzeroberfläche) läuft, ansonsten wird das Programm mit den in psexec angegebenen Rechten ohne Benutzeroberfläche im Hintergrund gestartet.
Enriqe
Enriqe 19.12.2012 um 09:07:15 Uhr
Goto Top
Hey Softmeister,
weiß der Teufel warum, aber wenn ich -i angebe, bekomme ich wieder die Meldung, "Datenbankserver nicht gefunden".
So langsam denke ich doch an´s Aufgeben face-sad
Ich wollte es ja nicht glauben, als die Softwarefirma die das Ding gestrickt hat sagte, dass das nicht geht.
Vielleicht stimmt es ja.
Ich danke Dir für Deine Bemühungen und werde jetzt einfach mal Deine zweite Variante ausprobieren.

Gruß
Enriqe
colinardo
colinardo 19.12.2012 um 10:22:59 Uhr
Goto Top
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
Enriqe
Enriqe 19.12.2012 um 12:26:25 Uhr
Goto Top
Hallo Uwe,

ja, so scheint es zu sein. Die Angabe von -i (auch mit Session ID) führt generell zur Meldung "Datenbankserver nicht gefunden" obwohl der Prozess mit User und Session genau so gestartet wird wie der, den ich lokal starte. (laut Process Explorer) - Verstehe es wer will. Auch das Hantieren mit allen anderen in Frage kommenden Parametern, ändert nichts an der Sache.
Deinen zweiten Vorschlag habe ich angepasst und so läuft es auch. Ich denke, das könnte auch eine Lösung sein. Ich habe es jetzt einmal so geplant, dass es alle 10 Minuten prüft und wenn der Prozess nicht da ist, wird er gestartet. Ich beobachte das jetzt einmal und bedanke mich noch einaml für Deine tolle und immer schnelle Hilfe.

Ich wünsche Euch allen da draußen ein frohes Weihnachtsfest und einen guten Rutsch in 2013
Enriqe
colinardo
colinardo 19.12.2012 um 12:31:33 Uhr
Goto Top
Keine Ursache, wünsche ebenfalls frohe Feiertage (ohne Weltuntergang face-wink) -- wenn es dann noch neue Serverhardware regnen würde wäre das neue Jahr gerettet! =(8--)

Uwe