Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Überprüfen, ob die Arbeitsstation gesperrt ist (https://www.delphipraxis.net/98573-ueberpruefen-ob-die-arbeitsstation-gesperrt-ist.html)

HansHans 29. Aug 2007 10:23


Überprüfen, ob die Arbeitsstation gesperrt ist
 
Hallo,

wie kann ich in einem Dienst prüfen, ob die Arbeitsstation gesperrt ist oder nicht?

dieser Code funktioniert nur in einer Anwendung nicht aber in einem Dienst!!

Delphi-Quellcode:
function IsWorkstationLocked: Boolean;
var
  hDesktop: HDESK;
begin
  Result := False;
  hDesktop := OpenDesktop('default',
    0, False,
    DESKTOP_SWITCHDESKTOP);
  if hDesktop <> 0 then
  begin
    Result := not SwitchDesktop(hDesktop);
    CloseDesktop(hDesktop);
  end;
end;

DGL-luke 29. Aug 2007 11:07

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Reine vermutung aus dem Hinterkopf - kann es sein, dass du gewisse Security-Tokens (oder wie auch immer die Dinger heißen) holen musst, um den Desktop wechseln zu dürfen(auch wenn du unter SYSTEM läufst)?

Die Anwendung muss den (Benutzer-)Desktop ja nicht öffnen, weil sie direkt in ihm läuft.

Dezipaitor 29. Aug 2007 11:24

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Was ist denn die Fehlermeldung? GetLastError fehlt hier.

HansHans 29. Aug 2007 12:24

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
@Dezipaitor
GetLastError liefert 5 -> Zugriff verwigert

Dezipaitor 29. Aug 2007 12:40

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Für welchen Befehl?

HansHans 29. Aug 2007 13:10

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
@Dezipaitor
bei der Funktion: hDesktop := OpenDesktop('default',0,false,DESKTOP_SWITCHDESKTO P);[list][*]

Dezipaitor 29. Aug 2007 13:35

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
hast du beim Dienst : "Interaktion mit dem Desktop" eingestellt?

Verwendest du Vista ?

HansHans 30. Aug 2007 07:00

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
@Dezipaitor
wie kann ich "Interaktion mit dem Desktop" einstellen?
der Dienst läuft unter Win XP

Luckie 30. Aug 2007 09:17

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Das kannst du bei der Dienstkonfiguration in der Diensteverwaltung machen. Davon ist aber abzuraten, da es ein potentielles Sicherheitsloch darstellt und ist deswegen unter Windows Vista auch nicht mehr möglich.

Dezipaitor 30. Aug 2007 10:00

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Verwende mal vorher OpenWindowStation und dann SetProcessWindowStation, damit wird der Prozess der WindowStation zugewiesen und kann etwas mehr mit den Desktops.

HansHans 30. Aug 2007 11:02

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
habs jetzt mit OpenWindowStation und SetProcessWindowStation versucht.
Funtioniert auch soweit, nur wenn der Rechner mit installiertem Dienst gestartet wird, "hängt" er vor der Windows-Anmeldung mit blauem Bildschirm.

Hier der Code:

Delphi-Quellcode:
function TTimeService.IsWorkstationLocked: Boolean;
var
  hDesktop : HDESK;
  hStation : THandle;
  ErrorCode : Integer;
begin
  Result := false;
  try
    hStation := OpenWindowStation('winsta0',false,MAXIMUM_ALLOWED);
    if hStation <> 0 then begin
      if SetProcessWindowStation(hStation) then begin
        hDesktop := OpenDesktop('default',0,false,DESKTOP_SWITCHDESKTOP);
        if hDesktop <> 0 then begin
          Result := not SwitchDesktop(hDesktop);
          CloseDesktop(hDesktop);
        end;
      end;
      CloseWindowStation(hStation);
    end;
  except
  end;
end;

Dezipaitor 30. Aug 2007 11:09

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Merk dir vor dem Aufruf von OpenWindowStation mit GetProcessWindowStation, die vorherige WindowStation,
dann schließe die WindowStation nicht mit CloseWindowStation
und setze stattdessen danach die alte WindowStation mit SetProcessWindowStation.

HansHans 30. Aug 2007 13:11

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
@Dezipaitor:
habs mit GetProcessWindowStation/SetProcessWindowStation versucht, funktioniert leider auch nicht!
nach der Windows-Meldung "Computereinstellungen werden übernommen" wird der Bildschirm blau und der Rechner reagiert nicht mehr.

beim Aufruf der Funktion GetProcessWindowStation wird LastError auf 1411 (Klasse ist nicht vorhanden) gesetzt.

Dezipaitor 30. Aug 2007 13:25

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Blauer Bildschirm des Todes oder Hintergrund blau?

Zeig doch mal den neuen Code.

HansHans 3. Sep 2007 17:01

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
hier der neue Code:

Delphi-Quellcode:
function TTimeService.IsWorkstationLocked: Boolean;
var
  hDesktop   : HDESK;
  hOldStation : THandle;
  hStation   : THandle;
  ErrorCode  : Integer;
begin
  Result := false;
  hOldStation := GetProcessWindowStation;
  if hOldStation = 0 then Exit;
  try
    hStation := OpenWindowStation('winsta0',false,MAXIMUM_ALLOWED);
    if hStation <> 0 then begin
      if SetProcessWindowStation(hStation) then begin
        hDesktop := OpenDesktop('default',0,false,DESKTOP_SWITCHDESKTOP);
        if hDesktop <> 0 then begin
          Result := not SwitchDesktop(hDesktop);
          CloseDesktop(hDesktop);
        end;
      end;
    end;
  except
  end;
  SetProcessWindowStation(hOldStation);
end;

HansHans 10. Sep 2007 14:26

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
kann mir keiner weiterhelfen???

Dezipaitor 10. Sep 2007 17:04

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Ich verstehe nur net, warum du Switchdesktop verwendest. Als Dienst kannst du damit zum default-Desktop zurückkehren
,ohne dass das System den UnLocked-Zustand bemerkt. Diese Technik wird in diesem Artikel beschrieben

Es gibt ein Opensourceprogramm, dass dir etwas mehr zum Thema zeigen kann.

Verwende OpenInputDesktop + GetUserObjectInformation (mit UOI_NAME), um zu erfahren, ob die Session 0 WindowStation derzeit Benutzereingaben nach Winlogon oder default annimmt.

Du kannst übrigens über WTSRegisterSessionNotification und WM_WTSSESSION_CHANGE Benachrichtigungen erhalten,
ob eine Session gerade gespeert oder entsperrt wurde. Das wäre etwas einfacher.
Jedoch funktioniert es nicht, wenn der Dienst (aus der ferne) später gestartet wird, und die Workstation bereits gespeert ist.
Auch ein Nachteil ist, dass es erst ab XP funktioniert. Man kann jedoch auch entfernte Rechner oder andere Terminals damit überprüfen.

HansHans 11. Sep 2007 09:51

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
@Dezipaitor:
Danke für die Antwort.

Das mit Switchdesktop habe ich aus einem Source-Beispiel, das ich beim googeln gefunden habe. Es Funktioniert ja auch, nur "hängt" das System beim Booten, wenn der Dienst gestartet wird (nach der Meldung "Benutzereinstellungen werden geladen").

Mit OpenInputDesktop + GetUserObjectInformation kann ich leider nicht viel anfangen. Vielleicht hast du ein Source-Beispiel?

Für WTSRegisterSessionNotification und WM_WTSSESSION_CHANGE brauche ich ein Windows-Handle, das ich bei einem Dienst aber nicht habe.

Dezipaitor 11. Sep 2007 10:12

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Hier gibts ein Beispiel.
Vielleicht funkz das ja? :D

WTSRegisterSessionNotification funktioniert auch mit Dienst.
Dazu muss man einen Thread erstellen und dort mit CreateWindow ein unsichtbares Fenster, welches dann eben ein Handle für die WTS... Nachricht bekommt. Am besten alles in diesem Thread machen lassen und dann über ein Event oder so an den Hauptthread senden. Geht natürlich auch über eine Variable, die muss dann aber geschützt werden.

generic 11. Sep 2007 10:21

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
ich meine mal gelesen zu haben, dass der sperrzustand über die gina.dll abgefragt werden kann.
(oder diese zumindest um das erweitert werden kann bzw. überredet werden kann ereignisse zu schicken)

Dezipaitor 11. Sep 2007 10:32

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
GINA + Vista = geht nicht

Olli 11. Sep 2007 13:36

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Zitat:

Zitat von Dezipaitor
GINA + Vista = geht nicht

Ich habe soeben meine GINA auf Vista kopiert und Vista hat es nicht verhindert!!! Vista und GINA geht also doch :mrgreen: :mrgreen: :mrgreen:

DGL-luke 11. Sep 2007 13:42

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Zitat:

Zitat von Dezipaitor
mit CreateWindow ein unsichtbares Fenster, welches dann eben ein Handle für die WTS... Nachricht bekommt

Delphi-Quellcode:
Messagewin := TWinControl.Create(-3);
Messagewin.WindowProc := MyWindowProc;
Extrem hilfreich, wenn man viel mit Messages arbeitet :)

@Olli: ARBEITET die gina.dll auch wie erwartet?

Dezipaitor 11. Sep 2007 14:25

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Zitat:

Zitat von Olli
Zitat:

Zitat von Dezipaitor
GINA + Vista = geht nicht

Ich habe soeben meine GINA auf Vista kopiert und Vista hat es nicht verhindert!!! Vista und GINA geht also doch :mrgreen: :mrgreen: :mrgreen:

fragt sich nur wie lange - bis zum nächsten SP ?

Olli 11. Sep 2007 15:03

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Zitat:

Zitat von Dezipaitor
Zitat:

Zitat von Olli
Zitat:

Zitat von Dezipaitor
GINA + Vista = geht nicht

Ich habe soeben meine GINA auf Vista kopiert und Vista hat es nicht verhindert!!! Vista und GINA geht also doch :mrgreen: :mrgreen: :mrgreen:

fragt sich nur wie lange - bis zum nächsten SP ?

Ich bin doch nicht doof. Habe die DLL natuerlich nicht ins Windowsverzeichnis sondern auf den Desktop kopiert. :mrgreen: :zwinker:

Dezipaitor 11. Sep 2007 15:45

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Zitat:

Zitat von Olli
Zitat:

Zitat von Dezipaitor
Zitat:

Zitat von Olli
Zitat:

Zitat von Dezipaitor
GINA + Vista = geht nicht

Ich habe soeben meine GINA auf Vista kopiert und Vista hat es nicht verhindert!!! Vista und GINA geht also doch :mrgreen: :mrgreen: :mrgreen:

fragt sich nur wie lange - bis zum nächsten SP ?

Ich bin doch nicht doof. Habe die DLL natuerlich nicht ins Windowsverzeichnis sondern auf den Desktop kopiert. :mrgreen: :zwinker:

Oh man.
Ich meinte natürlich : "Vista ignoriert Gina".

HansHans 12. Sep 2007 12:29

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
das Beispiel funktioniert leider auch nicht.

Habe jetzt in meinem alten Code am beginn der Funktion einfach abgefragt ob "Explorer.exe" ausgeführt wird, wenn nicht wird die Funktion verlassen. Damit Startet der PC mit installiertem Dienst ohne Probleme.

Dezipaitor 12. Sep 2007 18:33

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Warum funktioniert das Beispiel nicht? Was veranlasst dich das zu behaupten?

Olli 12. Sep 2007 19:18

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Zitat:

Zitat von Dezipaitor
Warum funktioniert das Beispiel nicht? Was veranlasst dich das zu behaupten?

Vista? :gruebel: :zwinker: :mrgreen:

Dezipaitor 12. Sep 2007 19:26

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Zitat:

Zitat von Olli
Zitat:

Zitat von Dezipaitor
Warum funktioniert das Beispiel nicht? Was veranlasst dich das zu behaupten?

Vista? :gruebel: :zwinker: :mrgreen:

Alles klar. Wir können schlussmachen. Die Sendung ist vorbei.

Danke, war echt schön mit euch. Aber das wars. Ich verabschiede mich von allen Zuschauern, von den Gästen, die mitgemacht haben und natürlich vom Ehrengast Olli. Deine Beiträge waren echt super. Ich freue mich auf ein Wiedersehen in einem anderen Thread. Macht's gut. Bis dann. Tschüüss - euer Thomas Gotschalk.

HansHans 13. Sep 2007 10:34

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
die Function OpenInputDesktop im Beispiel liefert als Ergebnis immer 0, egal ob der Arbeitsplatz mit <WIN><L> gesperrt ist oder ob der Arbeitsplatz nicht gesperrt ist.

Delphi-Quellcode:
hd := OpenInputDesktop(0, False, 0);
if hd = 0 then begin
  ...
end;

Dezipaitor 13. Sep 2007 11:06

Re: Überprüfen, ob die Arbeitsstation gesperrt ist
 
Ich hab das Beispiel nun mal auf dem Winlogon Desktop ausprobiert und es liefert TRUE.

Vielleicht muss man als Dienst noch explizit mit SetProcessWindowStation, den Prozess auf winsta0 setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:53 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