AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Überprüfen, ob die Arbeitsstation gesperrt ist
Thema durchsuchen
Ansicht
Themen-Optionen

Überprüfen, ob die Arbeitsstation gesperrt ist

Ein Thema von HansHans · begonnen am 29. Aug 2007 · letzter Beitrag vom 13. Sep 2007
Antwort Antwort
Seite 2 von 4     12 34      
HansHans

Registriert seit: 29. Aug 2007
12 Beiträge
 
#11

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

  Alt 30. Aug 2007, 12:02
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;
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#12

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

  Alt 30. Aug 2007, 12:09
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
HansHans

Registriert seit: 29. Aug 2007
12 Beiträge
 
#13

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

  Alt 30. Aug 2007, 14:11
@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.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#14

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

  Alt 30. Aug 2007, 14:25
Blauer Bildschirm des Todes oder Hintergrund blau?

Zeig doch mal den neuen Code.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
HansHans

Registriert seit: 29. Aug 2007
12 Beiträge
 
#15

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

  Alt 3. Sep 2007, 18:01
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;
  Mit Zitat antworten Zitat
HansHans

Registriert seit: 29. Aug 2007
12 Beiträge
 
#16

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

  Alt 10. Sep 2007, 15:26
kann mir keiner weiterhelfen???
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#17

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

  Alt 10. Sep 2007, 18:04
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
HansHans

Registriert seit: 29. Aug 2007
12 Beiträge
 
#18

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

  Alt 11. Sep 2007, 10:51
@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.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#19

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

  Alt 11. Sep 2007, 11:12
Hier gibts ein Beispiel.
Vielleicht funkz das ja?

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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#20

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

  Alt 11. Sep 2007, 11:21
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)
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  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 14:34 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