Externes Programm von Dienst aus starten

Hi,

mit folgender Funktion führe ich ein externes Programm aus:
Public Sub ShellandWait(ByVal ProcessPath As String)
Dim objProcess As System.Diagnostics.Process
Try
objProcess = New System.Diagnostics.Process()
objProcess.StartInfo.FileName = ProcessPath
objProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
objProcess.Start()

'Wait until the process passes back an exit code
objProcess.WaitForExit()

'Free resources associated with this process
objProcess.Close()
Catch
Console.WriteLine("Could not start process " & ProcessPath)
End Try
End Sub

Funktioniert auch problemlos, es sei den ich setzte das Ganze in einem Dienst ein.
Dann öffnet sich kein Programm mehr und die Funktion wird sofort wieder verlassen, allerdings gibt es auch keinen Fehler.

Hat jemand einie Lösung dafür?

Danke,

Andre

Hallo,
läuft der Dienst unter deinem eigenen User Account?
Meist fehlen dem Account unter dem der Service läuft irgendwelche Rechte.

Gruß
Joey

Hi,

nein, auf meinem Entwicklungsrechner gibt es nur zwei Accouts - meinen und den Standart Account des Admin - und beide haben Admin Rechte.
Den Test führe ich mit notepad.exe durch, wie gesagt, ohne Erfolg.

Danke,

Andre

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

nein, auf meinem Entwicklungsrechner gibt es nur zwei Accouts

  • meinen und den Standart Account des Admin - und beide haben
    Admin Rechte.

und der lokale System-Account, und der lokale ASPNET Account und der lokale IUSR_* Account und alle Domänen Accounts soweit der Rechner in einer AD ist.

Unter welchem Account läuft denn der Dienst?

Den Test führe ich mit notepad.exe durch, wie gesagt, ohne
Erfolg.

Woher weiß du, dass es nicht funktioniert? Notepad siehst du selbstverständlich nicht an der Oberfläche wenn der Dienst nicht mit deinem Account gestartet worden ist, aber den Prozess müsstest du doch im Taskmanager sehen.

Gruss
Joey

Ok, also ich installiere den Dienst wenn ich angemeldet bin via installutil und starte ihn dann auch umgehend.
Benutzer ist laut Protokol „nicht zutreffend“.
Der Rechner ist nicht in einer Domain.

Hm, es gibt keinen Notepad Prozess - aber das muss ja nicht unbedingt was bedeuten, den die Funktion wird ja auch sofort wieder verlassen, sprich objProcess.WaitForExit() greift ja erst gar nicht - kann also sein, dass der nur kurz gestartet wird und umgehend wieder beendet wird.
Eine Idee wie ich das testen kann?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

schreib halt ne Datei in das Applicationdata Verzeichnis. Dann weiste ob er startet.

Das installieren hat funktioniert? Das starten in den Diensten auch?
Wie fängst Du später unerwartete Fehler ab (Errorhandling)?

Ein Dienst wird immer mit einem User installiert, hier solltest Dui vorher sicherstellen, dass Du auch eine GUI hast, das ist bei Diensten nicht immer der Fall, die laufen auch, wenn gerade niemand angemeldet ist.

Hi,
dann starte den Dienst unter dem Account mit dem du eingeloggt bist.
Unter Dienste->Eigenschaften->Anmelden kannst du den User festlegen unter dem der Dienst dann ausgeführt wird.

Notepad ist ziemlich schlecht zum ausprobieren, insbesondere wenn du
mit „objProcess.WaitForExit()“ darauf wartest, dass der Prozess beendet wird. Aber wer soll denn Notepad beenden wenn du keine GUI hast, denn die Ausgaben/Fenster usw. eines Dienstes sind für den eingeloggten Benutzer i.d.R. nicht sichtbar.

Ansonsten folge dem Rat von Thomas

Gruss
Joey

Also,…

die Dienstprogrammierung ist eigentlich recht einfach. Du solltest nur aber einige Dinge beachten:

  1. Wenn der Dienst startet darf er nicht länger als ca. 25 benötigen um seine Arbeit zu verrichten

  2. Wenn 1) länger dauert - solltest Du einen Timer verwenden (WIchtig: Bitte nicht aus der Toolbox - das geht nicht - also selbst dekl. schreiben)

  3. Eigenschaften des Dienstes sollten gesetzt werden. Welches Status er hat etc.

  4. Wenn Du probs hast - setzte das Häckchen „Interaktiv mit Desktop arbeiten“ oder so. Dann siehst du teilweise was.

  5. Beobachte die Ereignissanzeige - die ist hilfreich.

  6. Debuge deinen Dienst. Du kannst deine Entwicklungsumgebung an den Dienst hängen.

  7. Sollte es irgendwie nicht klappen - kommentiere alles aus und versuche einfaches zu machen. Bsp. Eine Leere TExtdatei beim Starten schreiben. oder so. Hiermit stellst Du fest ob der Dienst überhaupt läuft - oder - schreibe mit dem Eventlog einträge in die EReignissanzeige und Debuge damit ein wenig. Schreibe Strings rein und oder wo der Dienst grad ist / macht.

  8. Wenn Du kein Benutzerkonto angegeben hast - fragt er dich bei instutil nach einen Userkonto. Geb hier eins an mit ausreichende Berechtigungen. Einschränken dann man nachhinnein… wenns net gleich läuft…

hmm, ich glaube das war es mal an Tips. Hab schon soo viel Dienste geschrieben… irgendwie sind die dinge Ge*l :smile:

Viele GRüße
Markus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]