![]() |
Service Application - CreateProcess...
Hallo zusammen,
ich habe leider ein Problem mit meinem Dienst, den ich in Delphi geschrieben habe. Kurze Beschreibung des Dienstes: Der Dienst soll später einen Pfad zu einem XML-File einlesen und vom XML-File die Werte einlesen. Gestartet werden können dann mehrere Anwendungen, die einem bestimmten Prozessorkern zugewiesen werden. Problem: In dem Dienst arbeite ich mit der Funktion CreateProcess (bzw. CreateProcessWithLogonW). Lasse ich das Programm nicht als Dienst ausführen, sondern als eine normale Konsolenanwendung, funktioniert es wunderbar. Die einzelnen Anwendungen starten und werden direkt einem Prozessorkern zugewiesen. Jedoch treten die ersten Probleme auf, sobald ich es als Dienst laufen lasse. Ich habe schon mehrere Ansätze verfolgt. Zunächst lief der Dienst unter 'Lokales System', mit der Folge, dass ein Prozess im Task Manager unter einer ProzessID vermerkt wurde, jedoch schien dieser "tot" zu sein, da er nichts gemacht hat. Danach habe ich die Option "Datenaustausch zwischen Dienst und Desktop zulassen" aktiviert. Nachdem ich den Dienst mit den Informationen "gefüttert" habe, startet auch ein Fenster, jedoch ohne Inhalt und ohne eine Möglichkeit etwas mit der Anwendung anzufangen. Auf den Prozess im Task Manager kann ebenfalls nicht zugegriffen werden. Als letztes habe ich versucht den Dienst über ein anderes Benutzerkonto mit Admin-Rechten zu starten, leider auch wieder ohne Erfolg. Ich bin leider mit meinem Latein am Ende und belästige Euch nur ungern, aber ich hoffe jemand kann mir eventuell bei diesem Problem helfen. Danke! Gruß |
AW: Service Application - CreateProcess...
Zitat:
[qzuote]als eine normale Konsolenanwendung, funktioniert es wunderbar. Die einzelnen Anwendungen starten und werden direkt einem Prozessorkern zugewiesen.[/quote] Du solltest dich mit der Funktionsweise und internen Aufbau von Windows vertraut machen. Du scheinst da ziemlich ins Blaue zu programmieren. Ein Dienst läuft in einer anderen WindowsStation als die Benutzer Prozesse. Innerhalb dieser WindowsStation existiert wieder ein Desktop in dem dann die vom Dienst gestarteten Programme laufen. Der interaktive Anwender sieht die gestarteten Programm als nicht und kann somit auch nicht mit ihen interagieren. Zitat:
Zitat:
Zitat:
Zitat:
Was du eigentlich willst, ist doch dass dein Dienst ein Programm startet mit dem der angemeldete interaktive Benutzer interagieren kann oder? Eventuell hilft dir dabei das: ![]() |
AW: Service Application - CreateProcess...
Zitat:
Ich werde mir erstmal deinen Link anschauen. Danke. |
AW: Service Application - CreateProcess...
Du kannst mit Deinem Dienst u.a. über Named Pipes oder per TCP-IP kommunizieren ......
|
AW: Service Application - CreateProcess...
Zitat:
|
AW: Service Application - CreateProcess...
@Luckie
Dann habe ich ihn wohl missverstanden, ich dachte er wolle eine Art Middle Tier basteln |
AW: Service Application - CreateProcess...
Hallo zusammen,
ich habe mich die Tage mit dem Lösungsansatz befasst und dieser Quellcode ist dabei herausgekommen. Jedoch habe ich ein kleines Problem mit einigen Zeilen (rot makiert). Meine Recherchen im Netz haben bisher noch keine positiven Ergebnisse gezeigt.
Code:
Die Funktion bricht bei SetTokenInformation ab. Daher vermute ich, dass es was mit der dwSessionID zusammenhängt.
interface
uses Windows; function CreateProcessAsUserA(Index: String; Counter: Integer ): Cardinal; function ProcessIdToSessionId (ProcessId : DWORD; var SessionId : DWORD) : BOOL; stdcall; external kernel32 name 'ProcessIdToSessionId'; implementation function CreateProcessAsUserA(Index: String; Counter: Integer ): Cardinal; var sui : TStartUpInfo; Pi : TProcessInformation; hNewToken: THandle; hProcessToken: THandle; dwSessionId: dword; Prozess: Boolean; processID: dword; reLength: dword; var WTSGetActiveConsoleSessionId: function: DWord; stdcall; begin processID:= GetCurrentProcessID; if ProcessIdToSessionId(processID,dwSessionID) then if dwSessionID <> $FFFFFFFF then begin hProcessToken := 0; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hProcessToken); DuplicateTokenEx(hProcessToken, MAXIMUM_ALLOWED, Nil, SecurityImpersonation, TokenPrimary, hNewToken); GetTokeninformation(hNewToken, TokenSessionID, @dwSessionID, sizeof(@dwSessionid), reLength); SetTokenInformation(hNewToken, TokenSessionId, @dwSessionId, sizeof(dwSessionID)); //CreateProcessAsUser Prozess:= CreateProcessAsUser(hNewToken, nil, PwideChar(index), nil, nil, false, Create_New_Console or NORMAL_PRIORITY_CLASS, nil, nil, sui, pi); //Allocate process to CPU SetProcessAffinityMask(pi.hProcess, Counter+1); Result:= pi.dwProcessId; CloseHandle(pi.hProcess); CloseHandle(pi.hThread); end; end; end. Edit: Die Funktion läuft jetzt durch, jedoch ohne einen Prozess zu starten. dwSessionID wird immer der Wert 0 zugewiesen... Kleine Verbesserung vorgenommen, jetzt bekommt dwSessionID seinen Wert, nur leider immer noch kein gestarter Prozess... :/ |
AW: Service Application - CreateProcess...
Problem gelöst. Alles funktioniert jetzt. Ich bedanke mich für die Hilfe Lucky.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz