Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mit Service auf Desktop zeichnen (https://www.delphipraxis.net/76522-mit-service-auf-desktop-zeichnen.html)

Olli 10. Sep 2006 09:55

Re: Mit Service auf Desktop zeichnen
 
Habe keinen Bock o.g. zu wiederholen. Fakt ist, daß ein Service mal erstens nie interaktiv sein sollte (Stichwort: Bei Google suchenShatter-Attack), was schon einige AV-Hersteller erfahren durften.

Du kannst einem Service-Thread auch sagen, daß er sich an einen anderen Desktop hängen soll, der aber immernoch in der gleichen Window-Station sein muß (MSDN-Library durchsuchenSetThreadDesktop). Zuvor müßte dein Prozeß aber Zugriff auf die WindowStation und den Desktop bekommen und dann die WindowStation wechseln (MSDN-Library durchsuchenSetProcessWindowStation). Aus dem Betrachten der Objektverzeichnis-Hierarchie nehme ich an, daß man die WindowStations einem jeweiligen Terminal zuordnen kann (wie andere Objekte auch). Allerdings ist das offenbar im PSDK nicht dokumentiert und ich habe keine Zeit mich ausführlich damit zu beschäftigen. Es gibt da spezielle DLLs zum Thema (WinSta.dll usw). Allesamt mit undokumentierten Funktionen die in MS-Tools (z.B. TaskManager) rege Verwendung finden.

Ich an deiner Stelle würde mir eine Ersatz-GINA basteln. Diese GINA kann jederzeit alles auf allen interaktiven Desktops (auch den SAS-Desktops) machen, wenn du es brauchst. Etwas Code (veraltet, weil Delphi) hier: http://assarbad.info/stuff/!export/ancient/agreementgina.rar

Zwar erfordert das unter Vista eine Neuausrichtung (dort gibt es eine neue Methode welche die GINA ersetzt, soweit ich weiß), aber für alle vorigen NT-Systeme bist du voll kompatibel.

SirThornberry 10. Sep 2006 12:06

Re: Mit Service auf Desktop zeichnen
 
Ich hab mich auch mal damit beschäftigt und komm jetzt an folgender Stelle nicht weiter:
Stand:
- Mein Service läuft jetzt in der Station "WinSta0" (also nicht mit in der Station "Service-0x0-3e7$")
- Somit kann ich auch den Hauptdesktop "Default" (und natürlich auch alle anderen Desktops in "WinSta0") öffnen
- Ich kann auch einen Process auf dem Desktop starten (ich geh zumindest davon aus das der Prozess auf dem Desktop gestartet wurde da ich in der eintsprechenden WinStation bin und bei CreateProcess den Desktop "Default" angegeben hab. Der Prozess tauch auch im Taskmananger auf, allerdings seh ich das Programm optisch nicht.

Muss ich da noch irgendwas beachten damit das Programm sichtbar ist auf dem Desktop?


PS.:
Auf den Desktop zeischnen und Formulare anzeigen (auch auf Winlogon) kann ich übrigens. Es scheitert wirklich nur noch am starten eines Prozesses auf dem Desktop.

Olli 10. Sep 2006 12:35

Re: Mit Service auf Desktop zeichnen
 
Das kann man ohne Code natürlich kaum sagen, denn deine Frage ist schon sehr spezifisch.

Ich nehme an, daß entweder die ACLs des Desktops in deinem Fall noch nicht stimmen, du bei CreateProcess was falsch machst, oder der Thread zuvor ein Impersonate machen muß um was auf dem Desktop zu starten. Wie gesagt, nix genaues weiß man nich - zumindest ohne deinen exakten Code.

SirThornberry 10. Sep 2006 15:20

Re: Mit Service auf Desktop zeichnen
 
So wechsle ich den Desktop (so das Zeischnen über GetDC(0) funktioniert und erzeugte TForms auch auf diesem Desktop landen)
Delphi-Quellcode:
var
  lDesktop,
  lStationNew  : Cardinal;
begin
  lStationNew := OpenWindowStation('WinSta0', True, GENERIC_ALL);
  if (lStationNew <> 0) then
  begin
    SetProcessWindowStation(lStationNew);
    lDesktop := OpenDesktop('Default', DF_ALLOWOTHERACCOUNTHOOK, True, GENERIC_ALL);
    if (lDesktop <> 0) then
    begin
      if SetThreadDesktop(lDesktop) then
        fCouldSwitch := True;
      CloseDesktop(lDesktop);
    end;
    CloseWindowStation(lStationNew);
  end;

Olli 10. Sep 2006 15:40

Re: Mit Service auf Desktop zeichnen
 
Hast du mal versucht die Zeile "fCouldSwitch := True;" durch dein CreateProcess (Desktop und WinSta nicht explizit angeben!) zu ersetzen?

SirThornberry 10. Sep 2006 15:57

Re: Mit Service auf Desktop zeichnen
 
Ok, damit gehts. Mit dem unschönen Nebeneffekt das sich zum Beispiel Notepad nicht zeichnet. So als würden keine Messages ankommen. Und aus irgend einem Grund kann ich in meiner Anwendung zwar klicken aber nix schreiben. (wenn ich mein Form bzw. Notepad auf dem Desktop "winlogon" ausführe)

Olli 10. Sep 2006 16:53

Re: Mit Service auf Desktop zeichnen
 
Zitat:

Zitat von SirThornberry
Ok, damit gehts. Mit dem unschönen Nebeneffekt das sich zum Beispiel Notepad nicht zeichnet. So als würden keine Messages ankommen. Und aus irgend einem Grund kann ich in meiner Anwendung zwar klicken aber nix schreiben. (wenn ich mein Form bzw. Notepad auf dem Desktop "winlogon" ausführe)

Erbt der erzeugte Prozess die Handles? Machst du es so wie in deinem obigen Beispiel, wird also das Handle (Desktop, WinSta) sofort wieder geschlossen?

SirThornberry 10. Sep 2006 17:09

Re: Mit Service auf Desktop zeichnen
 
Ob ich die Handles Sofort wieder schließe oder nicht ändert nichts am verhalten (grad probiert). Die Handles hab ich bisher nicht vererbt, "bInheritHandles" war also False. Wenn ich es auf "True" setze hab ich den Effekt das ich die Anwendung gar nicht zu gesicht bekomme (die bleibt dann unsichtbar)

Olli 10. Sep 2006 20:47

Re: Mit Service auf Desktop zeichnen
 
Zitat:

Zitat von SirThornberry
Ob ich die Handles Sofort wieder schließe oder nicht ändert nichts am verhalten (grad probiert). Die Handles hab ich bisher nicht vererbt, "bInheritHandles" war also False. Wenn ich es auf "True" setze hab ich den Effekt das ich die Anwendung gar nicht zu gesicht bekomme (die bleibt dann unsichtbar)

Faszinierend. Kannst du mir bitte mal dein Programm in einem kompilierbaren Zustand mit kurzer Erläuterung der einzelnen Dateien zuschicken?! Würde es gern mal selbst versuchen.

gsh 11. Sep 2006 11:35

Re: Mit Service auf Desktop zeichnen
 
@SirThornberry: Hi kannst du mir verraten wie du es geschaft hast das das Formular angezeigt wird? Denn ich hab des so probiert, aber es wird trozdem nicht angezeigt:
Delphi-Quellcode:
var
  lDesktop, lStationNew  : Cardinal;
begin
  lStationNew := OpenWindowStation('WinSta0', True, GENERIC_ALL);
  if (lStationNew <> 0) then
  begin
    SetProcessWindowStation(lStationNew);
    lDesktop := OpenDesktop('Default', DF_ALLOWOTHERACCOUNTHOOK, True, GENERIC_ALL);
    if (lDesktop <> 0) then
    begin
      if SetThreadDesktop(lDesktop) then
      begin
        Form1 := TForm1.Create(Service1);
        Form1.Show;
      end;
      CloseDesktop(lDesktop);
    end;
    CloseWindowStation(lStationNew);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.
Seite 2 von 4     12 34      

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