Programm bei Aufruf als Dienst starten
Hallo,
Ich versuche mit einem Renderprogramm im Netzwerk die Rendergeschwindigkeit drastisch zu verbessern. Für diesen Vorgang wurde bei den einzelnen Usern der dafür nötige Dienst installiert. Wenn nun der Auftrag von einem zentralen Server aus gestartet wird. Dann wird bei jedem User über den im Hintergrund laufenden Dienst das Programm zum Rendern aufgerufen. Dieser Start erfolgt in einem normalen Fenster mit normaler Priorität - Sachen gibt´s ;).
Da dieser Start öfters pro Tag abläuft ist er natürlich störend. Noch dazu werden die Computer für das normale Arbeiten recht stark beeinträchtigt.
Mein Vorhaben ist, dass dieses Programm im Hintergrund (als Dienst) mit niedriger Priorität gestartet wird. Das es Tools gibt mit denen ein Programm als Dienst gestartet werden kann ist mir bekannt. Bei all dieses Programmen kann dieser Dienst jedoch nur manuel oder automatisch gestartet werden.
Wenn ich dennoch dieses Programm als Dienst starte und der Auftrag vom Server erfolgt. Dann wird trotzdem eine zweite Instanz dieses Programmes (als Fenster im Vordergrund) gestartet.
Was ich gerne hätte ist, dass die *.exe Datei erst bei Abruf vom Server (von dem Netzwerkprogramm aus) als Dienst gestartet wird. Ich kann aber keine Batch Datei (mit den nötigen Befehlen) diesem Programm vorsetzen. Da das Serverprogramm direkten Zugriff auf die .exe benötigt. Es müßte also schon im System definiert sein, dass die .exe Datei immer bei Aufruf über ein anderes Programm als Dienst mit niedriger Priorität gestartet wird.
Für Lösungsvorschläge wäre ich sehr dankbar!
mfg
FPO
Ich versuche mit einem Renderprogramm im Netzwerk die Rendergeschwindigkeit drastisch zu verbessern. Für diesen Vorgang wurde bei den einzelnen Usern der dafür nötige Dienst installiert. Wenn nun der Auftrag von einem zentralen Server aus gestartet wird. Dann wird bei jedem User über den im Hintergrund laufenden Dienst das Programm zum Rendern aufgerufen. Dieser Start erfolgt in einem normalen Fenster mit normaler Priorität - Sachen gibt´s ;).
Da dieser Start öfters pro Tag abläuft ist er natürlich störend. Noch dazu werden die Computer für das normale Arbeiten recht stark beeinträchtigt.
Mein Vorhaben ist, dass dieses Programm im Hintergrund (als Dienst) mit niedriger Priorität gestartet wird. Das es Tools gibt mit denen ein Programm als Dienst gestartet werden kann ist mir bekannt. Bei all dieses Programmen kann dieser Dienst jedoch nur manuel oder automatisch gestartet werden.
Wenn ich dennoch dieses Programm als Dienst starte und der Auftrag vom Server erfolgt. Dann wird trotzdem eine zweite Instanz dieses Programmes (als Fenster im Vordergrund) gestartet.
Was ich gerne hätte ist, dass die *.exe Datei erst bei Abruf vom Server (von dem Netzwerkprogramm aus) als Dienst gestartet wird. Ich kann aber keine Batch Datei (mit den nötigen Befehlen) diesem Programm vorsetzen. Da das Serverprogramm direkten Zugriff auf die .exe benötigt. Es müßte also schon im System definiert sein, dass die .exe Datei immer bei Aufruf über ein anderes Programm als Dienst mit niedriger Priorität gestartet wird.
Für Lösungsvorschläge wäre ich sehr dankbar!
mfg
FPO
Please also mark the comments that contributed to the solution of the article
Content-ID: 42129
Url: https://administrator.de/forum/programm-bei-aufruf-als-dienst-starten-42129.html
Printed on: May 13, 2025 at 14:05 o'clock
4 Comments
Latest comment
Lösung: Fast Keine
Unter Umständen gibt es noch eine Möglichkeit.
Batch scheidet zwar aus, weil der Dienst wohl auf den Namen der Exe programmiert ist.
Du könntest die EXE aber umbenennen und selber eine EXE mit diesem Namen erzeugen. Die wird dann gestartet und müsste dann halt das echte Programm aufrufen.
Du müsstest aber unter Umständen beim Aufruf Parameter entgegennehmen und weitergeben und falls OLE oder NetDDE ins Spiel kommt müsste man das auch irgendwie umleiten.
Alternativ den Hersteller fragen.
Jedenfalls kannst Du den Aufruf einer Exe und den Start derselben nicht so einfach abfangen und in einen Dienststart umwandeln.
Unter Umständen gibt es noch eine Möglichkeit.
Batch scheidet zwar aus, weil der Dienst wohl auf den Namen der Exe programmiert ist.
Du könntest die EXE aber umbenennen und selber eine EXE mit diesem Namen erzeugen. Die wird dann gestartet und müsste dann halt das echte Programm aufrufen.
Du müsstest aber unter Umständen beim Aufruf Parameter entgegennehmen und weitergeben und falls OLE oder NetDDE ins Spiel kommt müsste man das auch irgendwie umleiten.
Alternativ den Hersteller fragen.
Jedenfalls kannst Du den Aufruf einer Exe und den Start derselben nicht so einfach abfangen und in einen Dienststart umwandeln.
Na ja, mit meinem vielgeliebten Universalwerkzeug WMI ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanch ... )kann man schon eine Prozessüberwachung hinbasteln, die ist aber nicht wirklich ressourcenschonend und vermutlich auch nicht schnell genug um ein Aufblitzen des Fensters auf dem Bildschirm zu verhindern.
Kleines WindowsScriptingHost Beispiel:
Set wmi = GetObject("winmgmts:{(Security)}")
Set fso = CreateObject("Scripting.FileSystemObject")
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","Prozess_")
wql = "select * from __instancecreationevent within 1 where targetinstance isa 'Win32_Process'"
wmi.ExecNotificationQueryAsync sink, wql
REM Bringt eine Messagebox und wenn ich die bestätige, dann beendet sich das Programm
MsgBox "Warte auf Events zur Ausgabe", vbSystemModal
Wscript.quit
Sub Prozess_OnObjectReady(objObject, objAsyncContext)
Set obj = objObject.TargetInstance
If LCase(obj.name)="Name der EXE" then
REM Priorität erniedrigen auf niedriger als normal
obj.SetPriority(0x00004000)
REM Leider keine Ahnung, wie man ein Programm in den Hintergrund kriegt mit WMI
REM Oder gleich beenden?
REM obj.terminate
End If
End Sub
Kleines WindowsScriptingHost Beispiel:
Set wmi = GetObject("winmgmts:{(Security)}")
Set fso = CreateObject("Scripting.FileSystemObject")
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","Prozess_")
wql = "select * from __instancecreationevent within 1 where targetinstance isa 'Win32_Process'"
wmi.ExecNotificationQueryAsync sink, wql
REM Bringt eine Messagebox und wenn ich die bestätige, dann beendet sich das Programm
MsgBox "Warte auf Events zur Ausgabe", vbSystemModal
Wscript.quit
Sub Prozess_OnObjectReady(objObject, objAsyncContext)
Set obj = objObject.TargetInstance
If LCase(obj.name)="Name der EXE" then
REM Priorität erniedrigen auf niedriger als normal
obj.SetPriority(0x00004000)
REM Leider keine Ahnung, wie man ein Programm in den Hintergrund kriegt mit WMI
REM Oder gleich beenden?
REM obj.terminate
End If
End Sub