AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Mit Service auf Desktop zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

Mit Service auf Desktop zeichnen

Ein Thema von gsh · begonnen am 5. Sep 2006 · letzter Beitrag vom 13. Sep 2006
Antwort Antwort
Seite 2 von 4     12 34      
Olli
(Gast)

n/a Beiträge
 
#11

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 10:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 13:06
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#13

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 13:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 16:20
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#15

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 16:40
Hast du mal versucht die Zeile "fCouldSwitch := True;" durch dein CreateProcess (Desktop und WinSta nicht explizit angeben!) zu ersetzen?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 16:57
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#17

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 17:53
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 18:09
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#19

Re: Mit Service auf Desktop zeichnen

  Alt 10. Sep 2006, 21:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#20

Re: Mit Service auf Desktop zeichnen

  Alt 11. Sep 2006, 12:35
@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;
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 11:18 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