![]() |
Screenshot aus TService
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,
ich stehe vor dem Problem einen Screenshot des aktuell angemeldeten Benutzer (nur Workstation an Console, kein RDP oder Terminalserver) aus einem TService heraus zu machen. Komme aber mit meinem Wissen nicht so recht weiter und brauch eure Unterstützung. Folgendes habe ich bereits zusammengesucht um auf dem lokalen Desktop zu kommen (und hoffe, dass das soweit korrekt ist).
Delphi-Quellcode:
Aufruf:
function TScreenCapture.GetScreenBitmap(bmp: Vcl.Graphics.TBitmap; lpszWinSta: PWideChar): Boolean;
var hDeskCurrent: HDESK; hdesk1: HDESK; hwinstaCurrent: HWINSTA; hwinsta1: HWINSTA; Canvas: TCanvas; r: TRect; begin hwinstaCurrent:=GetProcessWindowStation; if hwinstaCurrent<>0 then begin hwinsta1:=OpenWindowStation(lpszWinSta, False, WINSTA_ACCESSCLIPBOARD or WINSTA_ACCESSGLOBALATOMS or WINSTA_CREATEDESKTOP or WINSTA_ENUMDESKTOPS or WINSTA_ENUMERATE or WINSTA_EXITWINDOWS or WINSTA_READATTRIBUTES or WINSTA_READSCREEN or WINSTA_WRITEATTRIBUTES); if hwinsta1<>0 then begin if SetProcessWindowStation(hwinsta1) then begin hdesk1:=OpenDesktop('default', 0, False, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_WRITEOBJECTS); // Hier Screenshot machen if SetThreadDesktop(hdesk1) then begin Canvas := TCanvas.Create; try Canvas.Handle:=GetWindowDC(hdesk1); try //GetWindowRect(Canvas.Handle, r); bmp.Width:=Screen.Width; bmp.Height:=Screen.Height; bmp.PixelFormat:=pfDevice; BitBlt(bmp.Canvas.Handle, 0, 0, Pred(bmp.Width), Pred(bmp.Height), Canvas.Handle, 0, 0, SRCCOPY); finally ReleaseDC(0, Canvas.Handle); end; finally Canvas.Free; end; end; CloseDesktop(hdesk1); end; end; end; end;
Delphi-Quellcode:
Soweit so gut. Diese Funktion lasse ich in einem Thread laufen (Source hängt an).
bmp:=Vcl.Graphics.TBitmap.Create;
try try GetScreenBitmap(bmp, 'WinSta0'); except DoLastError(GetLastError); end; bmp.SaveToFile(FPath+'bmp.bmp'); finally bmp.Free; end; Wenn ich das über eine TApplication, also über den Benutzercontext, laufen lassen, bekomme ich auch eine Bitmap. Allerdings ist diese weiß. Lass ich das über ein TService laufen, bekomme ich ebenfalls eine weiße Bitmap. Zusätzlich tritt bei Screen.Width, bei Screen.Height oder beim BitBlt (und wenn ich es drin lasse auch beim GetWindowRect) ein Windows-Fehler 1400 auf. Irgendwas mache ich wohl grundsätzlich falsch. Ich bin mir auch nicht sicher, ob ich aus einem TService auf Screen zugreifen kann. Wär nett, wenn sich das mal jemand anschauen könnte. Vielen Dank |
AW: Screenshot aus TService
Delphi-Quellcode:
Das ist schonmal falsch, den hdesk1 ist kein window handle (HWND). Versuch mal
Canvas.Handle:=GetWindowDC(hdesk1);
Delphi-Quellcode:
Canvas.Handle:=GetWindowDC(HWND_DESKTOP);
|
AW: Screenshot aus TService
Vielleicht ist es so, dass es nicht so einfach möglich ist das UI aus dem Service anzusprechen.
![]() ![]() ![]() ![]() Ich denke aber es sollte irgendwelche Hacks und Tricks geben, um einen Screenshot zu machen. |
AW: Screenshot aus TService
Wenn das nicht gehen würde, was machen denn dann Dienste wie VNC und so. Gehen wird es schon.
PS: Vielleicht ist die ![]() |
AW: Screenshot aus TService
Zitat:
![]() |
AW: Screenshot aus TService
Genau das war es, danke 😎
|
AW: Screenshot aus TService
Dienste laufen in einem anderen Desktop und kommen da auch nicht raus.
Du brauchst also zu deinem Dienst ein Programm das in der aktuell User session sitzt und dir die Bilder liefert. |
AW: Screenshot aus TService
Zitat:
Die Idee mit DesktopDuplicationApi ist auch nett, ich sehe da aber nirgends dass man sich vom Service aus was holen könnte. Wahrscheinlich ist das Ergebnis im Service dann auch wieder nur schwarz oder weiss, aber eben nicht aus dem User Process. Hat es damit denn funktioniert ? |
AW: Screenshot aus TService
Hast Du es mal mit
Delphi-Quellcode:
probiert? Und anstelle von default für den Desktopnamen
OpenWindowStation('winsta0', True, GENERIC_ALL)
Delphi-Quellcode:
?
GetUserObjectInformation(OpenInputDesktop(0, false, GENERIC_ALL), UOI_NAME, @pDesktopname, 256, dwLen)
|
AW: Screenshot aus TService
Zitat:
Delphi-Quellcode:
kommt SystemError 170.
FDuplication.GetFrame
Möglicherweise muss ich mich von dem Anspruch verabschieden, dass gänzlich unter Verzicht einer Application im Usercontext zu realisieren. Ziel war eigentlich die Manipulation der Function über den Taskmanager zu unterbinden. Allerdings hat die DesktopDuplicationApi noch eine anderen Nachteil. Sie greif nämlich immer nur den primären Bildschirm ab. Bei 2 oder mehr Monitoren fehlt also immer einiges. Und ich habe (zumindes im Wrapper) keine Möglichkeit gefunden, den Bildschirm zu wechseln (allerdings würde ich beide gleichzeitig benötigen). Zitat:
|
AW: Screenshot aus TService
Zitat:
Ich denke, es ist nicht ohne Grund so, dass selbst die großen Fische unter den Fernzugrifftools ein Desktop Programm haben. Die Frage ist ob das unter dem Nutzer Account läuft oder unter Admin. Verhindern dass es abgeschossen wird kannst du nicht. Aber es extrem schwehr machen es abgeschossen zu lassen. |
AW: Screenshot aus TService
Zitat:
Also ich würde vom Service einen Daemon starten der alles über Dll bereitstellt. Rein vom logischen ablauf her. (Service -> Daemon -> Dll abrufe mit Screenshot -> zurück zum Service) Versucht so etwas selber zu basteln habe ich bis jetzt noch nicht aber Interessant finde ich dieses Projekt schon! |
AW: Screenshot aus TService
Wenn ich das richtig in Erinnerung habe, kann man seit Windows 10 nicht mehr im Dienst auf den Input-Desktop wechseln.
So hatte ich es nämlich bis Windows 10 mit meinem Remote-Desktop-Programm gemacht, was aber mit Windows 10 nicht mehr ging. Daher benutze ich seit dem den Dienst nur noch als Steuerungsprogramm, dass unter anderem das "normale" Programm startet, das im passenden User-Kontext läuft (und das kann auch die UAC-Anzeige sein) und das dann den Desktop fotografiert und an den Client sendet (bzw. nur die jeweiligen Änderungen des Desktops). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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