AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Anwendung aus Dienst heraus starten

Anwendung aus Dienst heraus starten

Ein Thema von Captnemo · begonnen am 16. Apr 2015 · letzter Beitrag vom 17. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 19:40
Hi,

ich weiß, das Thema gab es hier schon öfter, aber eine Lösung habe ich bisher nicht gefunden (oder übersehen).

Ich will aus einem Dienst heraus eine Anwendung starten. Mach ich zur Zeit mit ShellExecute was soweit auch funktioniert.

Der Prozess wird zwar gestartet, aber das Window erscheint nicht. Und es scheint auch so, als dass der gestartete Prozess auch nichts macht (wobei ich das noch mal prüfen müsste).

Der Prozess wird natürlich unter dem Konto gestartet, unter dem auch der Dienst läuft. Aber auch wenn ich das auf das Userkonto ändere ändert das nichts an dem Verhalten, außer, dass jetzt die Anwendung auch unter dem Userkonto gestartet wird, aber weiterhin ohne sichtbares Fenster.

Gibt es eine Möglichkeit die Anwendung so zu starten (muß ja nicht mit Shellexecute sein), das das Fenster genauso erscheint, als hätte ich es manuell gestartet?
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.961 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 20:06
Ist das nicht dieses Häkchen "Datenaustausch zwischen Dienst und Desktop zulassen"? in services.msc?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.100 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 20:08
Ist das nicht dieses Häkchen "Datenaustausch zwischen Dienst und Desktop zulassen"? in services.msc?
Nicht mehr in supporteden OS-Versionen. Die letzte Version bei der die Checkbox funktionierte war XP.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#4

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 20:18
Den Haken gibt's auch nicht mehr....leider.

Bin grad mit einer Batchdatei am testen, aber so richtig klappt das auch nicht. Ich könnt mir natürlich ein kleines Programm in die TBNA legen, welches das dann sicherlich zuverlässig erledigt. Aber ich hatte gehofft noch eine andere (bessere) Lösung zu finden.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.961 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 20:22
Also ich weiß nicht, ob es jetzt wirklich ein Dienst sein muss, und ob er nun im Konto SYSTEM laufen soll oder im Benutzerkonto. Gehen tut das schon. Ich habe es bislang aber nur so gemacht dass eine Anwendung auf dem SYSTEM-Konto läuft und die Anwendung dann auf dem Desktop des grade lokal angemeldeten Benutzers aufmacht.


Sieht bei mir so aus:

Delphi-Quellcode:
interface

type
   /// <summary>
   /// Startet einen Prozess in der Session des grade angemeldeten Users
   /// </summary>
   /// <remarks>
   /// <para>Muss von einer Anwendung im Kontext von <c>SYSTEM</c> aufgerufen
   /// werden</para><para>Benötigt Windows Vista oder höher</para>
   /// <para>Ich habe keine Ahnung wie sich das bei RPD verhält</para>
   /// </remarks>
   TLocalProcessLauncher = class
      protected
         /// <remarks>
         /// Das zurückgegebene <c>THandle</c> muss, wenn es nicht mehr
         /// benötigt wird, mit <c>WinApi.Windows.CloseHandle(..)</c>
         /// geschlossen werden
         /// </remarks>
         /// <summary>
         /// Liefert das <i>Client Access Token</i> um mittels
         /// <c>CreateProcessAsUser(..)</c> einen Prozess im Kontext
         /// der lokal angemeldeten Session starten zu können
         /// </summary>
         /// <exception cref="EOSError" />
         class function createSessionToken(): THandle;

      public
         /// <exception cref="EOSError" />
         class procedure launchProcess(
            const   absolutePath:   String;
            const   arguments:      String   =   ''
         );

   end platform;
und

Delphi-Quellcode:
implementation

uses
  System.IOUtils,
  Winapi.Windows, System.SysUtils;


class function TLocalProcessLauncher.createSessionToken(): THandle;
const
   SE_DEBUG_NAME = 'SeDebugPrivilege';
   desiredAccess: DWORD =
      TOKEN_ADJUST_PRIVILEGES or
      TOKEN_QUERY or
      TOKEN_DUPLICATE or
      TOKEN_ASSIGN_PRIMARY or
      TOKEN_ADJUST_SESSIONID or
      TOKEN_READ or
      TOKEN_WRITE;
var
   sessionID:      DWORD;
   serviceToken:   THandle;
   userToken:      THandle;
   tokenPriv:      TTokenPrivileges;
   luid:         TLargeInteger; //wtf?
begin
   sessionID := WTSGetActiveConsoleSessionId();

   Win32Check(
      OpenProcessToken(
         GetCurrentProcess(),
         desiredAccess,
         serviceToken
      )
   );
   try
      Win32Check( LookupPrivilegeValue(nil, SE_DEBUG_NAME, luid) );
      tokenPriv.PrivilegeCount := 1;
      tokenPriv.Privileges[0].Luid := luid;
      tokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

      Win32Check(
         DuplicateTokenEx(
            serviceToken,
            MAXIMUM_ALLOWED,
            nil,
            WinApi.Windows.SecurityIdentification,
            WinApi.Windows.TokenPrimary,
            userToken
         )
      );

      Win32Check( SetTokenInformation(userToken, TokenSessionId, @sessionID, SizeOf(sessionID)) );
   finally
      CloseHandle(serviceToken);
    end;

   Result := userToken;
end;

class procedure TLocalProcessLauncher.launchProcess(const absolutePath, arguments: String);
var
   token:   THandle;
   args:   PChar;

   startupInfo:   TStartupInfo;
   processInfo:   TProcessInformation;
begin
   if arguments.IsEmpty() then args := nil else args := PChar(arguments);

   token := createSessionToken();
   try
      startupInfo := Default(TStartupInfo);
      startupInfo.cb := SizeOf(TStartupInfo);
        startupInfo.lpDesktop := 'winsta0\Default';

      Win32Check(
         CreateProcessAsUser(
            token,
            PChar(absolutePath),
            args,
            nil,
            nil,
            false,
            NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE,
            nil,
            nil,
            startupInfo,
            processInfo
         )
      );

   finally
      CloseHandle(token);
   end;
end;
Man sollte sich aber bewusst sein was das für ein gewaltiges Sicherheitsrisiko ist. Ich habe dafür auch keinen praktischen Anwendungsfall und das nur mal aus Spaß gemacht...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 20:30
Das kann mit ShellExecute nicht funktionieren. Dienste laufen in einer anderen Windowstation. Siehe hier: http://michael-puff.de/Programmierun...Stations.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.961 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 20:38
Aber wenn er sagt dass sein Service im Kontext des aktuellen Benutzers läuft? Dann unterscheidet er sich doch eigentlich gar nicht von einer normalen Anwendung die der Benutzer gestartet hätte, oder? Warum sollte ShellExecute dann nicht klappen?

Grade kurz ausprobiert, es klappt tatsächlich nicht. Aber warum?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 20:52
Ein Dienst läuft unter dem System Konto, welches in einer anderen WindowsStation läuft.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.961 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 21:02
Das habe ich verstanden, aber ein Dienst kann doch ebenso gut in einem anderen Kõnto laufen, unter anderem das des grade angemeldeten Benutzers.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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

AW: Anwendung aus Dienst heraus starten

  Alt 16. Apr 2015, 21:06
Dann ist es kein Dienst. Dann ist es ein Programm, was einfach beim Anmelden des Benutzers gestartet (Stichwort Autostart) wird und beim Abmelden wieder beendet. Ein Dienst hat ja gerade die Besonderheit, dass er unter dem System Konto läuft und so erweiterte Berechtigungen hat. Zum Beispiel um Updates installieren zu können.

Er könnte mit CreateProcessAsUser aus dem Dienst heraus ein Programm starten, was im Kontext des Benutzers läuft. Dazu braucht es aber dessen Anmeldedaten.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (16. Apr 2015 um 21:08 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf