Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tray Icon, Service und Vista (https://www.delphipraxis.net/81242-tray-icon-service-und-vista.html)

mwitzsche 23. Nov 2006 09:03


Tray Icon, Service und Vista
 
Ich teste gerade Dienste (D7 + SVCom) unter Vista Final. Allerdings gibt es da jetzt ein Problem, es werden keine Tray Icons mehr angezeigt. Ich habe mit CoolTrayIcon und anderen Komponenten getestet. Auch eigener API Code greift nicht. Unter XP/NT/2003 passt alles. Muss also an Vista liegen. Hat sonst noch jemand das gleiche Problem oder schon eine Lösung?

Danke.

sakura 23. Nov 2006 09:06

Re: Tray Icon, Service und Vista
 
Zitat:

Zitat von mwitzsche
Muss also an Vista liegen. Hat sonst noch jemand das gleiche Problem oder schon eine Lösung?

Microsoft hat endlich die Lücke geschlossen und lässt eine Interaktion von NT-Diensten mit dem Desktop nicht mehr zu, da dieses eine der größten Sicherheitslücken dieser überhaupt ist. Da musst Du einen anderen Ansatz wählen: i.A.: Einen Dienst der mit einer zweiten Desktopanwendung via Hier im Forum suchenPipes kommuniziert.

...:cat:...

mwitzsche 23. Nov 2006 09:14

Re: Tray Icon, Service und Vista
 
Danke erst mal für die fixe Antwort. Ich hatte schon so eine Vermutung, es gab wohl auch mal einen Artikel dazu. Leider habe ich den verlegt. Da es aber in Vista die Einstellung für den Dienst (LocalAccount + Interaktiv) noch gibt, dachte ich, es müsste auch funktionieren :-) Schöner Mist.

SirThornberry 23. Nov 2006 10:03

Re: Tray Icon, Service und Vista
 
uj, da muss ich mir ja Vista doch noch mal installieren. Das würde ja bedeuten das SetThreadDesktop etc. nicht mehr funktioniert?! Oder kann man darüber vielleicht doch noch auf den Desktop zugreifen (also wenn man einen Thread der Anwendung auf den Userdesktop befördert)

spidergen 6. Mär 2007 08:03

Re: Tray Icon, Service und Vista
 
Ich versuche derzeit auch, einen Dienst unter Vista ans laufen zu bekommen. Mir ist bewusst, dass diese nicht mehr interaktiv sein dürfen. Jedoch bekomme ich schon beim Versuch, den Dienst zu installieren eine Fehlermeldung "Dienstname.exe funktioniert nicht mehr".

Was muss ich weiterhin bei der Erstellung von Diensten für Vista beachten?

Luckie 6. Mär 2007 09:27

Re: Tray Icon, Service und Vista
 
Guck mal hier: http://www.microsoft.com/whdc/system..._Services.mspx und hier: http://www.microsoft.com/whdc/system.../services.mspx

spidergen 6. Mär 2007 10:00

Re: Tray Icon, Service und Vista
 
Super, danke!

Leider bekomme ich es immernoch nicht ans laufen. Selbst ein noninteraktiver Dienst, der ohne jeglichen Inhalt (s.u.) kompiliert wurde, ist unter Vista bisher bei mir nicht lauffähig. Ich denke daher, dass es nicht an der Programmierung der Funktionalitäten scheitert, sondern an der "Deklaration" des Dienstes selbst.

Delphi-Quellcode:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TService2 = class(TService)
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  Service2: TService2;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service2.Controller(CtrlCode);
end;

function TService2.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

end.
Der Dienst soll Informationen mit einer anderen Anwendung austauschen. Da interaktive Dienste bei Vista ja nicht mehr gestattet sind, dachte ich also am Memory Mapped Files (MMF). Unter WinXP funktioniert das auch alles.

Sehe ich das richtig, dass MMF nicht der richtige Weg zur Interprozesskommunikation in Vista ist?

Tyrael Y. 6. Mär 2007 10:13

Re: Tray Icon, Service und Vista
 
Microsoft schlägt vor nur noch über RPC oder Pipes zwischen Programmen zu kommunizieren.

Wenn man zB komplexere Dialoge aus einem Dienst heraus anzeigen möchte, sollte man zusätzlich zum Dienst eine zweite Applikation erstellen. Diese Applikation läuft unter dem User-Desktop und erhält durch zB eine Pipe die Nachrichten, welcher Dialog jetzt angzeigt werden soll.

Der Service läuft unter Vista immer in dem sogennannten Desktop0, alle User-Desktops aufsteigend im Desktop1, 2 usw.

Zu beachten ist dabei auch die Registry.
Dort sollte man sehr drauf achten, daß beide Programme auf die Werte auch zugreifen können. Der Service wird es in der Regel können, aber wenn der Service zB einen Registrywert erstellt hat, kann es die Applikation nicht unbedingt lesen.
Es sollte darauf geachtet werden, daß solche Werte in einem Registryzweig stehen auf die beide Zugriff haben, zumindest lesend.

spidergen 6. Mär 2007 11:12

Re: Tray Icon, Service und Vista
 
Ok, die Interprozesskommunikation werde ich dann wohl mal auf Pipes umstricken.

Wisst ihr nun zufällig auch noch, warum sich der Dienst nicht starten lässt?

Dezipaitor 14. Mär 2007 18:22

Re: Tray Icon, Service und Vista
 
ich kann mich noch dunkel erinnern, wie es UltraVNC macht.

1. Service installieren (TCB) und Thread erstellen
2. Eingabedesktop suchen (OpenInputDesktop) und für Thread setzen (SetThreadDesktop)
3. GetPixel(GetDC(Null)) verwenden um Pixel zu lesen.

Problem : Funktioniert nicht mehr unter Vista, weil SystemDienste nun in einer eigenen Session 0 (nicht interaktiv) laufen.
Was kann man machen?

A. Mirror Treiber
B. Über Einschleussen von Prozessen in die interaktive Sitzung (für jeden Desktop, auch wenn er später erstellt wird)
Kommunikation über Pipes, Shared Memory, Sockets oder RPC.

Keine Gewähr zur Funktion!

P.S.
Ich frage mich gerade, ob mit Session, LogonSession gemeint ist oder WinStation oder was anderes?
Kennt jemand eine grafische Darstellung, wie Sessions (evt. LogonSessions), WinStation und Desktops in Beziehung stehen?

Zu B.
Wenn Session = LogonSession könnte man ja auch einen Thread in die Session 1 oder höher impersonieren, und damit auf den Desktop zugreifen können.
siehe diesen MSDN Artikel zu FUS

Luckie 14. Mär 2007 22:20

Re: Tray Icon, Service und Vista
 
Liste der Anhänge anzeigen (Anzahl: 1)
Grafik nicht, aber ich hoffe, ich kann es kurz mal beschreiben. Ich arbeite übrigens gerade an einem etwas längerem Artikel zu diesem Thema.

Die übergeordnete Einheit ist die WindowsStation. Eine WindowsStation beinhaltet die Desktops. Eine besondere Rolle nimmt die WindowsStation WinSta0 ein, da sie die einzige interaktive WindowsStation im System ist, die mit dem Benutzer interagieren kann. Sie beinhaltet mindesttens zwei Desktops: einmal den default Desktop des Benutzers und den WinLogon Desktop des WinLogon Prozesses. Diesen Desktop sieht man, wenn man Strg+Alt+Entf drück, wenn man eingeloggt ist.

Eine Logon Session repräsentiert eine Instanz eines speziellen Benutzers.

Fügen wir das ganze mal an einem Beispiel zusammen:
Die Firma ist die WindowsStation, eine Abteilung ist eine Ressource des Computers und die LogonSession wäre der Firmenausweis. Nehmen wir an wir sind als Gast in einer Firma mit sicherheitsrelevanten Abteilungen. Wir kommen also an Firmentor (Anmeldedialog) und weisen usn beim Pförtner aus (benutzername und Passwort). Der Pförtner gibt uns einen Firmenausweis, der uns dazu berechtigt bestimmte Abteilungen der Firma zu betreten (Nutzung von Ressourcen des Computers). Wollen wir nun eine Abteilung betreten, wird unser Firmenausweis kontrolliert und uns wird Zutritt gewährt oder nicht. Gäbe es dieses System nicht, müssten wir jedesmal, wenn wir eine Ressource´nutzen wollten, uns gegenüber dem System authentifizieren - und arbeiten wäre wohl nahe zu unmöglich.

Soweit das ganze mal in Kürze, ich hoffe, es war einigermassen verständlich.

Im Anhang noch mal ein kleines Programm, was das ganze etwas visualisiert: Die WinSta0 wurde von dem Bneutzer mit der SID S-1-5-5-X-Y erzeugt. Dies ist eine System LogonSession. Aus dem PSDK:
Zitat:

SECURITY_LOGON_IDS_RID
(S-1-5-5-X-Y)
A logon session. This is used to ensure that only processes in a given logon session can gain access to the window-station objects for that session. The X and Y values for these SIDs are different for each logon session.
Interessant ist noch die WindowsStation "Service-0x0-3e7$" (999 in dezimaler Schreibweise ;) ). Dies ist die WindowsStation des Systemkontos. Diese Bezeichnung ist übrigens hard gecodet, da es immer nur eine geben kann. Die System Logon Session beinhaltet alle User mode Prozesses, die zur TBC (Trusted Computer Base) gehören, wie das Local Security Authority Subsystem (LSASS.EXE), den Logon Prozess (WINLOGON.EXE) und das Win32- SubSystem (CSRSS.EXE).

Dezipaitor 15. Mär 2007 00:35

Re: Tray Icon, Service und Vista
 
Liste der Anhänge anzeigen (Anzahl: 1)
Seeehr viele Artikel in der MSDN sprechen einfach von Session. Diese meinen also im eigentlichens Sinne LoginSession . Maschinen und Menschen können sich gegenüber dem System authentifizieren und bekommen dadurch eine neue Session, in der sie unter ihren Logindaten (credentials) agieren.

@Luckie: Machst du eine deutsche Übersetzung von Keith Brown "Programming Windows Security" ? (wie Luther die Bibel übersetzte, so dass mehr Leute diese lesen konnten ;-)

Übrigens sieht meine Ausgabe bei mir so aus (habe das RID durch XXXXX ersetzt):
Delphi-Quellcode:
WindowsStationen
================

WinSta0
  Handle: 64
  Benutzer SID: S-1-5-5-0-XXXXX
  benannte SID: GetLastError: 1332
  Desktops:
   Default
     Handle: 96
     Benutzer SID: S-1-5-5-0-XXXXX
     benannte SID: GetLastError: 1332
   Disconnect
     Handle: 0
     Benutzer SID: GetLastError: 998
     benannte SID: GetLastError: 1337
   Winlogon
     Handle: 0
     Benutzer SID: GetLastError: 998
     benannte SID: GetLastError: 1337


Service-0x0-3e7$

Service-0x0-3e4$

Service-0x0-3e5$
Die Services unterhalb von 3e7 scheinen von IIS zu sein.

Mich würde die Ausgabe unter Vista interessieren.


Angehängt habe ich ein kleines Programm, dass ich schnell in C++ runtergetippt habe, um die LoginSessions mittels WTSEnumerateSessions zu erfahren.
Den Quellcode habe ich dazugelegt (Visual C++ 2003).
Es zeigt jede 5 sek die aktuellen Sessions.
Man kann Änderungen sehen,
1. wenn man z.b. ein Fast User Switching (FUS) macht
2. den RemoteDesktop unter Systemsteuerung\System aktiviert und deaktiviert
3. Verbindungen zum RDP herstellt, beendet und einloggt.

Delphi-Quellcode:


WTSEnumerateSessions:

0. <<aktuelle Desktopsitzung>>
Name: Console
ID: 0
State: WTSActive

1. <<anderer Benutzer über FUS>>
Name:
ID: 1
State: WTSDisconnected

2. <<ein RDP listener>>
Name: RDP-Tcp
ID: 65536
State: WTSListen
Wer kann das in Vista testen?

Luckie 15. Mär 2007 08:46

Re: Tray Icon, Service und Vista
 
Die Ausgabe ist OK. Ich habe die gleiche. Es dürfte an den fehlenden Rechten liegen. Und die Funktion, um die Sessions zu enumeriern habe ich noch gesucht. Besten Dank.

Dezipaitor 15. Mär 2007 18:53

Re: Tray Icon, Service und Vista
 
Da wir in einem Delphiforum sind,
hier der Delphicode zum runterladbaren,obigen C pendant :

Delphi-Quellcode:
program WTSTest;

{$APPTYPE CONSOLE}

uses {win32api_current.zip units bei http://jedi-apilib.sourceforge.net}
  jwaWindows,jwaWTSApi32,SysUtils;


function GetErrorString(err : DWORD) : String;
var s : PCHAR;
begin
  if(FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER or
            FORMAT_MESSAGE_FROM_SYSTEM,
            0,
            err,
            0,
            PCHAR(@s),
            0,
            nil) = 0) then
   begin
     result := 'unkown error';
          exit;
   end;

        result := s;

   LocalFree(HLOCAL(s));

end;

var pInfo : Array of WTS_SESSION_INFO;
    i,count : DWORD;

begin
  writeln('WTSEnumerateSessions (quit with Ctrl+C)');
  writeln;



  while true do
  begin
    if not WTSEnumerateSessions(WTS_CURRENT_SERVER,0,1,PWTS_SESSION_INFO(pInfo),count) then
    begin
      writeln(GetErrorString(GetLastError));
      halt(1);
    end;
    try
      for i := 0 to count -1 do
      begin
        writeln(IntToStr(i)+'.');
        writeln('Session: '+ pInfo[i].pWinStationName);
        writeln('ID: '+IntToStr(pInfo[i].SessionId));
        write('State: ');
        case pInfo[i].State of
          WTSActive      : writeln('WTSActive');
          WTSConnected     : writeln('WTSConnected');
     WTSConnectQuery : writeln('WTSConnectQuery');
     WTSShadow     : writeln('WTSShadow');
     WTSDisconnected : writeln('WTSDisconnected');
     WTSIdle     : writeln('WTSIdle');
     WTSListen     : writeln('WTSListen');
     WTSReset     : writeln('WTSReset');
     WTSDown     : writeln('WTSDown');
     WTSInit     : writeln('WTSInit');
   else
        writeln('???');
        end;
      end;
    except
      writeln('Exception caught');
    end;
    writeln;

    WTSFreeMemory(pInfo);

    Sleep(5000);
  end;
end.

Codewalker 26. Jul 2007 18:11

Re: Tray Icon, Service und Vista
 
*push*

Wie bekommt man denn jetzt die nette Delphi-Vorlage TServiceApplication Vista-fähig? Selbst ohne jeden Inhalt verursacht sie beim Installieren einen Fehler.

Grüße

Thomas

Luckie 26. Jul 2007 19:12

Re: Tray Icon, Service und Vista
 
Zitat:

Zitat von Codewalker
verursacht sie beim Installieren einen Fehler.

Lass mich raten, das Ei hat zu lange gekocht und ist hart geworden.

Codewalker 26. Jul 2007 20:37

Re: Tray Icon, Service und Vista
 
Ja, schon verstanden, Fehler ist etwas allgemein.. aber Vista sagt mir nicht mehr. Es kommt der Standarddialog, dass das Programm aufgrund eines Fehler geschlossen werden musste und er sucht nach Lösungen (die er natürlich nicht findet - schon klar).


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 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