Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi GetCurrentUrl in einem Service (https://www.delphipraxis.net/129390-getcurrenturl-einem-service.html)

Thanatos81 18. Feb 2009 09:32


GetCurrentUrl in einem Service
 
Moin zusammen!

Ich versuche gerade die GetCurrentUrl-Prozedur aus diesem Beitrag in einem Service zu packen.

Hintergrund ist, dass ich überwachen möchte wann welche Internetseite aufgerufen wird. Idealerweise möchte ich URL und Title loggen, URL alleine würde aber auch gehen.

Das Problem ist ja, dass ich aus dem Service heraus auf den Desktop des Users (WinSta0\default) zugreifen muss. Der Desktop reicht, weil an dem entsprechenden Rechner nur ein Benutzer angemeldet ist, die schnelle Benutzerumschaltung aus und auch ein Autologon.

Nun, das Öffnen der WindowStation, des Desktops und ein EnumDesktopWindows funktionieren einwandfrei. Nur das GetCurrentUrl nicht. Habe auch schon versucht vorher SetProcessWindowStation und SetThreadDesktop aufzurufen, das hilft aber leider nichts.

Kann ich GetCurrentUrl in einem Service komplett vergessen, weil es DDE nutzt? Gibt es sonst eine Möglichkeit, z.B. per Handle des Browser, die aktuelle URL auszulesen?

Delphi-Quellcode:
wsHandle := OpenWindowStation('WinSta0', true, WINSTA_ACCESSCLIPBOARD or
  WINSTA_ENUMDESKTOPS or
  WINSTA_ENUMERATE or
  WINSTA_READATTRIBUTES or
  WINSTA_READSCREEN);

if wsHandle <> 0 then
begin
  dHandle := OpenDesktop('Default', 1, false,
    DESKTOP_ENUMERATE or
    DESKTOP_HOOKCONTROL or
    DESKTOP_READOBJECTS or
    DESKTOP_SWITCHDESKTOP);
  if dHandle <> 0 then
  begin
    sl := TStringList.Create;
    try
      sl.Duplicates := dupIgnore;
      EnumDesktopWindows(dHandle, @EnumWindowCallback, Integer(sl));
      sl.SaveToFile('c:\liste.txt');

      if SetProcessWindowStation(wsHandle) <> 0 then
        if SetThreadDesktop(dHandle) <> 0 then
          GetCurrentUrl(url, title); //< - -Hier steigt der Service aus
     

      if (trim(url) <> '') or (trim(title) <> '') then
      begin
        sl.Clear;
        sl.Add(url + ': ' + title);
        sl.SaveToFile('c:\urls.txt');
      end;
      sleep(5000);
    finally
      FreeAndNil(sl);
    end;
  end;
end;

Dezipaitor 18. Feb 2009 13:36

Re: GetCurrentUrl in einem Service
 
Meine Glasskugel sagt mir:
Delphi-Quellcode:
SetThreadDesktop(dHandle);
schlägt vllt. fehl.

Thanatos81 18. Feb 2009 14:20

Re: GetCurrentUrl in einem Service
 
Komisch, das sagte meine Glaskugel auch schon. Selber Hersteller? :P

Deswegen habe ich zwischenzeitlich eine Überprüfung des Rückgabewertes auf ungleich 0 eingebaut. Hab das nur nich neu reingeschrieben, um nicht unnötig zu pushen. Aber ich werd mal gleich den ersten Beitrag dementsprechend editieren.

Dezipaitor 18. Feb 2009 14:49

Re: GetCurrentUrl in einem Service
 
Wo kommt die Funktion überhaupt her?

Thanatos81 18. Feb 2009 14:52

Re: GetCurrentUrl in einem Service
 
Zitat:

Zitat von Dezipaitor
Wo kommt die Funktion überhaupt her?

Welche? SetThreadDesktop? Die kommt aus der Api, unter Delphi einfach "Windows" in die uses aufnehmen und schon steht die zur Verfügung.

Dezipaitor 18. Feb 2009 23:48

Re: GetCurrentUrl in einem Service
 
Nein:

GetCurrentUrl

Thanatos81 19. Feb 2009 07:13

Re: GetCurrentUrl in einem Service
 
Zitat:

Zitat von Thanatos81
Ich versuche gerade die GetCurrentUrl-Prozedur aus diesem Beitrag in einem Service zu packen.

Na, das hab ich doch extra im ersten Post erwähnt ;-)

Bernhard Geyer 19. Feb 2009 07:20

Re: GetCurrentUrl in einem Service
 
Verwendest du Vista/Windows 2008

Thanatos81 19. Feb 2009 07:25

Re: GetCurrentUrl in einem Service
 
Nein, Windows XP und 2000. Vista/Windows 7 sind nicht von Interesse und Server-Systeme eh nicht. Da sitzt niemand dran und surft ;-)

Bernhard Geyer 19. Feb 2009 07:27

Re: GetCurrentUrl in einem Service
 
Zitat:

Zitat von Thanatos81
Nein, Windows XP und 2000. Vista/Windows 7 sind nicht von Interesse und Server-Systeme eh nicht. Da sitzt niemand dran und surft ;-)

IE7 oder IE8? Dieser wird ja (AFAIK auch unter XP) mit sehr wenigen Rechten gestartet.

Thanatos81 19. Feb 2009 07:29

Re: GetCurrentUrl in einem Service
 
Zielfenster sind hauptsächlich Firefox. Installiert ist aber der 7er, falls das von Belang ist.

Bernhard Geyer 19. Feb 2009 07:36

Re: GetCurrentUrl in einem Service
 
Was anderes: ist das für eine Firma? Wurde die Mitarbeiterüberwachung mit dem Betriebsrat abgestimmt oder will man Lidl&Co. nachfolgen?

Thanatos81 19. Feb 2009 07:39

Re: GetCurrentUrl in einem Service
 
Das ist erst mal für unseren Praktikantenrechner. Und die Praktikanten werden sicherlich drauf hingewiesen, Betriebsrat gibt es aufgrund der Unternehmensgröße nicht. Falls ein Kunde das haben möchte, werde ich den natürlich auch drauf hinweisen, dass er das nicht "einfach so" installieren darf.

hazard999 19. Feb 2009 08:02

Re: GetCurrentUrl in einem Service
 
Wäre ein Proxy nicht einfacher?

Thanatos81 19. Feb 2009 10:23

Re: GetCurrentUrl in einem Service
 
Theoretisch ja. Aber a) nutze ich das um mich mit dem Thema Dienste zu beschäftigen und b) kann man den Dienst per EnumDesktopWindows auch um andere Programme (Solitär etc.) erweitern.

Ich werde mich wohl erst Mal mit EnumDesktopWindows begnügen, da ich da ja den Title der Webseite bekomme. Das sollte eigentlich in 99% der Fälle reichen.

Ach und noch etwas wegen der Überwachung. Wird ein entsprechendes Programm gefunden, wird inzwischen auch eine MessageBox angezeigt, die auf die Überwachung hinweist ;-)

Dezipaitor 19. Feb 2009 10:30

Re: GetCurrentUrl in einem Service
 
hmm, DDE also.

DDE + Service? Hmmmmmmmm.
Ich vermute du musst diese DDE Funktionen im Benutzerkontext aufrufen. Also z.B. ImpersonateLoggedonUser damit nutzen.

Aber natürlich funktioniert das nicht in Vista und in XP mit FUS. Wenn der Praktikant sich als zweiter Benutzer einloggt, dann kann er machen was er will.

Habt ihr so schlechte Erfahrungen mit Praktikanten gemacht?

Bernhard Geyer 19. Feb 2009 10:32

Re: GetCurrentUrl in einem Service
 
Was du entwickelst (GUI-Interaktion aus Dienst) ist eh ein Aussterbendes "Betätigungsfeld" da ab Vista (Vista, Windows 2008, Windows 7) eh interaktion Dienst <-> GUI praktisch nicht mehr erlaubt ist.

Thanatos81 19. Feb 2009 10:38

Re: GetCurrentUrl in einem Service
 
Zitat:

Zitat von Dezipaitor
hmm, DDE also.

DDE + Service? Hmmmmmmmm.
Ich vermute du musst diese DDE Funktionen im Benutzerkontext aufrufen. Also z.B. ImpersonateLoggedonUser damit nutzen.

Danke, das werd ich mal testen.

Zitat:

Zitat von Dezipaitor
Habt ihr so schlechte Erfahrungen mit Praktikanten gemacht?

Teilweise. Eines der Erlebnisse (bei weitem nicht das schlimmste, eher ein kurioses) lässt sich auch hier in der DP finden ;-)

Wegen der Hinweise auf Vista/7 usw. Das ist ja alles schön und gut. Nur für meinen konkreten Fall unerheblich. Und unterm Strich bleibt auf jeden Fall das Wissen um das Schreiben von Diensten inkl TCP-Server und einer Verwaltungs-GUI. So das mein Aufwand nicht umsonst ist ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz