nobody007
Goto Top

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

Content-Key: 42129

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

Printed on: April 23, 2024 at 08:04 o'clock

Member: AndreasHoster
AndreasHoster Oct 13, 2006 at 16:05:44 (UTC)
Goto Top
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.
Member: Nobody007
Nobody007 Oct 17, 2006 at 14:27:49 (UTC)
Goto Top
Danke für den Tip! Hab jetzt mal versucht das ganze mit der EXE abzufangen. Läuft leider auch schief face-sad. Das Programm dürfte doch etwas komplexer Arbeiten als ich anfangs dachte.

Eine andere Idee geht mir gerade durch den Kopf. Mit einem Dienst könnte ich die laufenden Prozesse ständig überwachen, und falls die EXE auftaucht wird diesem Prozess der Wert übertragen für niedrige Priorität und in den Hintergrund setzen (auch nicht in der Taskleiste sichtbar). ABER...ich weiß noch nicht wie ich das ganze in die Praxis umsetze. Gibt´s da vielleicht schon was fertiges? (Bin mir ziemlich sicher, aber ich hab noch nix gefunden das sich so adaptieren läßt)

Aja - das ganze sollte möglichst Resourcen schonend ablaufen ;) (der PC sollte ja nicht gleich in die Knie gehen wenn ein Dienst ständig die Prozesse überwacht)
Member: AndreasHoster
AndreasHoster Oct 17, 2006 at 15:40:10 (UTC)
Goto Top
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
Member: Nobody007
Nobody007 Nov 07, 2006 at 11:47:50 (UTC)
Goto Top
Danke, für die prompten Antworten! Hab noch ein paar andere Projekte beenden müssen, aber jetzt habe ich wieder Zeit für dieses.

Also das mit WMI zu schreiben ist für mich Neuland. Ich hab jedoch ein paar kleine Tools gefunden die das Problem schon fast lösen - mit der Betonung auf fast!

Es gibt 2 Tools die mir bei der Arbeit behilflich sind:
1. - ProcView (Command line Tool -> PV.exe)
2. - Cmdow.exe (Fenster in Win Managen)

mit PV kann ich die Prozesse auslesen (und zwar in einer endlos Schleife alle 2 Sekunden) und gleichzeitig die priorität einstellen :praktisch:
mit CMDOW kann ich das gewünschte Fenster in den Hintergrund setzen
...aber! CMDOW benötigt für das setzen in den Hintergrund eine sogenannte "Caption" vom Prozess. Jedoch ändert sich diese "Caption" (unten rot markiert) natürlich mit jedem neuen Auftrag, weil darin der Dateiname enthalten ist.

Wie kann ich also diese "Caption" auslesen und für CMDOW "schmackhaft machen? Weil im Moment mußte ich mich auf diesen Dateinamen fixieren.

@echo off
cmdow @ /hid
:start
PV.exe -f -r0 -d2000 3ds* >nul
if ERRORLEVEL 1 goto Process_NotFound
:Process_Found
cmdow "test01.max - 3ds max 5" /hid
PV.exe -f -pi 3ds*
PV.exe -f -x 3ds*
goto start

Besten Dank im Voraus für die tolle Hilfe in diesem Forum!