AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Service Application - CreateProcess...
Thema durchsuchen
Ansicht
Themen-Optionen

Service Application - CreateProcess...

Ein Thema von pate444 · begonnen am 26. Okt 2011 · letzter Beitrag vom 16. Nov 2011
Antwort Antwort
pate444

Registriert seit: 24. Jul 2011
16 Beiträge
 
#1

Service Application - CreateProcess...

  Alt 26. Okt 2011, 10:52
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Service Application - CreateProcess...

  Alt 26. Okt 2011, 11:29
Der Dienst soll ... Gestartet werden können dann mehrere Anwendungen
Ich habe es mal auf das wesentliche zusammengeschrumpft.

[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:
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.
Was heißt "tot"?`Wenn er keine CPU-Zeit verbraucht hat, heißt das nur, dass der nichts zu tun hatte.

Zitat:
Danach habe ich die Option "Datenaustausch zwischen Dienst und Desktop zulassen" aktiviert.
Aua. Läuft das unter dem Motto: "Wir haben noch nicht genug Sicherheitslücken, lasst uns selbst noch welche aufreißen"? Diese Option gibt es ab Vista nicht mehr. wäre also auch keine Lösung, wenn es funktioniert hätte.

Zitat:
Auf den Prozess im Task Manager kann ebenfalls nicht zugegriffen werden.
Logisch. Da der Prozess vom Dienst gestartet wurde, läuft er auch in dessen Benutzerkontext und erbt dessen Berechtigungen usw. Und unter Windows kann man eben nicht so einfach die Prozesse eines anderen Benutzers beenden.

Zitat:
Als letztes habe ich versucht den Dienst über ein anderes Benutzerkonto mit Admin-Rechten zu starten, leider auch wieder ohne Erfolg.
Siehe ganz oben.

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: http://www.c-plusplus.de/forum/263737
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
pate444

Registriert seit: 24. Jul 2011
16 Beiträge
 
#3

AW: Service Application - CreateProcess...

  Alt 26. Okt 2011, 11:39
Zitat:
Was du eigentlich willst, ist doch dass dein Dienst ein Programm startet mit dem der angemeldete interaktive Benutzer interagieren kann oder?
Ja genau. Der soll später durch einen angemeldeten Benutzer auf einem Server mehrere Rechnungen starten.

Ich werde mir erstmal deinen Link anschauen. Danke.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Service Application - CreateProcess...

  Alt 26. Okt 2011, 13:00
Du kannst mit Deinem Dienst u.a. über Named Pipes oder per TCP-IP kommunizieren ......
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Service Application - CreateProcess...

  Alt 26. Okt 2011, 13:37
Du kannst mit Deinem Dienst u.a. über Named Pipes oder per TCP-IP kommunizieren ......
Hm, davon hat er nichts geschrieben. Er will doch nur aus dem Dienst heraus eine Anwendung für den angemeldeten interaktiven Benutzer starten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Service Application - CreateProcess...

  Alt 26. Okt 2011, 13:40
@Luckie

Dann habe ich ihn wohl missverstanden, ich dachte er wolle eine Art Middle Tier basteln
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
pate444

Registriert seit: 24. Jul 2011
16 Beiträge
 
#7

AW: Service Application - CreateProcess...

  Alt 9. Nov 2011, 08:54
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:
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.
Die Funktion bricht bei SetTokenInformation ab. Daher vermute ich, dass es was mit der dwSessionID zusammenhängt.

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... :/

Geändert von pate444 ( 9. Nov 2011 um 11:37 Uhr)
  Mit Zitat antworten Zitat
pate444

Registriert seit: 24. Jul 2011
16 Beiträge
 
#8

AW: Service Application - CreateProcess...

  Alt 16. Nov 2011, 09:16
Problem gelöst. Alles funktioniert jetzt. Ich bedanke mich für die Hilfe Lucky.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz