[Delphi] Screenshot opvragen met loginscherm zichtbaar

Pagina: 1
Acties:
  • 394 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Buzzin Hornet
  • Registratie: September 2002
  • Niet online
Wij zitten hier op ons werk een programma te maken waarmee we schermen over het netwerk van de ene pc naar de andere sturen. Dit werkt allemaal prima. Alleen nu willen we ook kunnen zien als de pc gelocked is of bij het inlogscherm is.

Deze screenshots pakt die niet met de volgende code. Het resultaat is gewoon een zwart of wit scherm. En dit terwijl die wel een windows desktop laat zien.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TClientForm.CaptureScreen(AFileName: string);
const
  CAPTUREBLT = $40000000;
var
  hdcScreen: HDC;
  hdcCompatible: HDC;
  bmp: TBitmap;
  hbmScreen: HBITMAP;
begin
  // Create a normal DC and a memory DC for the entire screen. The
  // normal DC provides a "snapshot" of the screen contents. The
  // memory DC keeps a copy of this "snapshot" in the associated
  // bitmap.

  hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
  hdcCompatible := CreateCompatibleDC(hdcScreen);
  // Create a compatible bitmap for hdcScreen.
  Label1.Caption := IntToStr(GetLastError);
  Mouse.CursorPos := Point(550,350);
  hbmScreen := CreateCompatibleBitmap(hdcScreen,
    GetDeviceCaps(hdcScreen, HORZRES),
    GetDeviceCaps(hdcScreen, VERTRES));

  // Select the bitmaps into the compatible DC.
  SelectObject(hdcCompatible, hbmScreen);
  bmp := TBitmap.Create;
  bmp.Handle := hbmScreen;
  BitBlt(hdcCompatible,
    0, 0,
    bmp.Width, bmp.Height,
    hdcScreen,
    0, 0,
    SRCCOPY or CAPTUREBLT);

  bmp.SaveToFile(AFileName);
  bmp.Free;
  DeleteDC(hdcScreen);
  DeleteDC(hdcCompatible);
end;


Onze vraag is: Hoe kan je een screenshot opvragen/krijgen van een gelockte pc of van het inlogscherm van windows?

I intend to live forever - so far, so good.


Acties:
  • 0 Henk 'm!

Anoniem: 30225

Buzzin Hornet schreef op maandag 20 december 2004 @ 11:15:
Wij zitten hier op ons werk een programma te maken waarmee we schermen over het netwerk van de ene pc naar de andere sturen. Dit werkt allemaal prima. Alleen nu willen we ook kunnen zien als de pc gelocked is of bij het inlogscherm is.

Deze screenshots pakt die niet met de volgende code. Het resultaat is gewoon een zwart of wit scherm. En dit terwijl die wel een windows desktop laat zien.

Onze vraag is: Hoe kan je een screenshot opvragen/krijgen van een gelockte pc of van het inlogscherm van windows?
De code werkt wel.
Je kan alleen screens capturen van het gedeelte wat werkelijk zichtbaar is.

Applicaties draaien op een secure desktop.
Zo heeft Windows 2k bijvoorbeeld de volgende standaard desktops draaien (als ik me niet vergis). Login/Logoff/etc., User Desktop, Screensaver, services x desktop. Applicaties die draaien in een bepaalde desktop kunnen niet zomaar acties uitvoeren in een ander desktop.

Het eenvoudigste is om je applicatie te starten in het login-desktop om hier een schermafdruk van te maken. Dit kan nog efficienter. De details laat ik ff achterwege (hint: je kan een event opvangen bij het wisselen tussen de verschillende desktops) De code hierboven kun je aanhouden.

De CreateProcess-API vraagt een StartupInfo-parameter waar je op kan geven in welk desktop je applicatie moet runnen.

Enkele voorbeelden zijn:
"WinSta0\Default"
"WinSta0\Winlogon"

De rest moet je zelf even op/uitzoeken.

Acties:
  • 0 Henk 'm!

Anoniem: 118860

VNC kan het (draaiend als service). Je zou er de source van op na kunnen slaan.

Acties:
  • 0 Henk 'm!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23:00

Tomatoman

Fulltime prutser

Een screenshot maken van een loginscherm vind ik een nogal dubieuze actie, het klinkt verdacht veel als spyware. Wat is precies de bedoeling?

Een goede grap mag vrienden kosten.


Acties:
  • 0 Henk 'm!

Anoniem: 25556

Waarom zou je er uberhaupt een screenshot van willen hebben? De constatering dat ie gelocked is, is toch voldoende?

Immers:
Alleen nu willen we ook kunnen zien als de pc gelocked is of bij het inlogscherm is.
tomatoman schreef op dinsdag 21 december 2004 @ 23:52:
Een screenshot maken van een loginscherm vind ik een nogal dubieuze actie, het klinkt verdacht veel als spyware. Wat is precies de bedoeling?
Wat zou spyware daar mee moeten dan? Kun je hooguit de username achterhalen, maar dat kon je toch al. Het password komt er niet te staan hoor ;)

[ Voor 47% gewijzigd door Anoniem: 25556 op 22-12-2004 01:13 ]


Acties:
  • 0 Henk 'm!

  • Buzzin Hornet
  • Registratie: September 2002
  • Niet online
tomatoman schreef op dinsdag 21 december 2004 @ 23:52:
Een screenshot maken van een loginscherm vind ik een nogal dubieuze actie, het klinkt verdacht veel als spyware. Wat is precies de bedoeling?
Als opdracht op werk hebben ze ons gevraagd om een remote controle tool te maken waarmee ze meerdere schermen van servers te kunnen controleren op aanpassingen en errormeldingen. Als er een loginscherm weer gegeven wordt moet men in kunne loggen maar wij krijgen deze niet te zien.

De opmerking van WinLogon is inderdaad misschien wel een optie, ik ga er maandag naar kijken!

I intend to live forever - so far, so good.


Acties:
  • 0 Henk 'm!

Anoniem: 113889

Buzzin Hornet schreef op zaterdag 25 december 2004 @ 16:28:
[...]


Als opdracht op werk hebben ze ons gevraagd om een remote controle tool te maken waarmee ze meerdere schermen van servers te kunnen controleren op aanpassingen en errormeldingen. Als er een loginscherm weer gegeven wordt moet men in kunne loggen maar wij krijgen deze niet te zien.
Remote desktops zitten standaard in XP. Xp kent ook remote resistries en remote logging. Ik denk dat jullie proberen het wiel opnieuw uit te vinden.

Acties:
  • 0 Henk 'm!

  • SavageNL
  • Registratie: November 2001
  • Laatst online: 27-06 14:52
Anoniem: 113889 schreef op zondag 26 december 2004 @ 09:44:
[...]


Remote desktops zitten standaard in XP. Xp kent ook remote resistries en remote logging. Ik denk dat jullie proberen het wiel opnieuw uit te vinden.
We moeten een programma maken waarmee je in 1 keer verschillende servers tegelijk kunt zien, het hoeft niet helemaal realtime te gebeuren, er moet gewoon gelet worden op de bandbreedte (dus 1x per 10 sec een screenshot ofzo)

Het is nuttig om te zien of de server gelocked is omdat je dan de server over kan nemen en in kan loggen (dat gaat zo moeilijk als je niks ziet, maar een ander probleem op dit moment is ook dat ctrl alt delete sturen niet zo makkelijk is en ook (nog) niet lukt)

De code uit de VNC programma's wil ook niet helemaal lukken, ik kan niet zien waar ze switchen tussen desktops, en als ik zelf naar de WinLogon desktop wil gaan krijg ik een access denied fout en er achteraan een Invalid handle (testprogramma draait onder lokaal beheerder)

Acties:
  • 0 Henk 'm!

  • SavageNL
  • Registratie: November 2001
  • Laatst online: 27-06 14:52
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function TScreenShooter.GetScreen(Kwaliteit : Integer;ASender: TIdCommand) : TCanvas;
var
  new_desktop, old_desktop : HDESK;
  Dummy : DWord;
  new_name : PChar;

  Bitmap : TBitmap;
  JPG    : TJpegImage;
  Canv   : TCanvas;
  Stream : TMemoryStream;
  Breedte: Integer;
  Hoogte : Integer;
  DC     : HDC;
begin
  new_desktop := OpenInputDesktop(0, FALSE,
                          DESKTOP_CREATEMENU OR DESKTOP_CREATEWINDOW OR
                          DESKTOP_ENUMERATE OR DESKTOP_HOOKCONTROL OR
                          DESKTOP_WRITEOBJECTS OR DESKTOP_READOBJECTS OR
                          DESKTOP_SWITCHDESKTOP OR GENERIC_WRITE);

  old_desktop := GetThreadDesktop(GetCurrentThreadId());

    GetUserObjectInformation(new_desktop, UOI_NAME, @new_name, 256, dummy);

    SetThreadDesktop(new_desktop);
    CloseDesktop(old_desktop);

  Breedte := Screen.Width;
  Hoogte := Screen.Height;

  Bitmap := TBitmap.Create;
  JPG := TJpegImage.Create;
  Canv := TCanvas.Create;
  Stream := TMemoryStream.Create();

  try
    DC := GetDC( GetDesktopWindow );
    Canv.Handle := DC;

    Bitmap.Width  := Breedte;
    Bitmap.Height := Hoogte;

    Bitmap.Canvas.CopyRect(Bitmap.Canvas.ClipRect, Canv, Rect(0,0,Screen.Width, Screen.Height));
    Result := Bitmap.Canvas;

    JPG.Assign(Bitmap);
    JPG.CompressionQuality := Kwaliteit;

    JPG.SaveToStream(Stream);

    ASender.Thread.Connection.WriteStream(Stream, True, True, Stream.Size);
    ReleaseDC(GetDesktopWindow, DC);
  finally
    try
      JPG.Free;
      Canv.Free;
      Stream.Free;
    except on Exception do
    end;
  end;
end;

Dit is ie nu, en hij werkt :D hij moet dus als system draaien... Voor ctrl alt delete was hetzelfde probleem, die is zo opgelost:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure TMonitorService.ServerctrlaltdeleteCommand(ASender: TIdCommand);
var
    h_desk : HDESK;
    h_winsta : HWINSTA;
begin
  h_winsta := OpenWindowStation('winsta0', 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 (h_winsta = 0) then
      Exit;

    if (NOT SetProcessWindowStation(h_winsta)) then
      Exit;

    h_desk := OpenDesktop('Winlogon', 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);
    if (h_desk = 0) then
      exit;

    if (NOT SetThreadDesktop(h_desk)) then
      exit;

    PostMessage(HWND_BROADCAST,WM_HOTKEY,0,
        MAKELPARAM(MOD_ALT OR MOD_CONTROL,VK_DELETE));
end;
Pagina: 1