AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

Ein Thema von 361 · begonnen am 7. Nov 2017 · letzter Beitrag vom 9. Nov 2017
Antwort Antwort
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.933 Beiträge
 
Delphi 12 Athens
 
#1

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 8. Nov 2017, 14:35
das Problem ist, dass dieser in einem Service ausgeführt wird. Unter Windows XP klappt das noch, aber ab Windows 7 läuft das nicht mehr. Hat jemand eine Idee, wie man das lösen könnte?
Das steht ja auch in der Dokumentation...
https://msdn.microsoft.com/de-de/lib...or=-2147217396
Zitat:
The LockWorkStation function is callable only by processes running on the interactive desktop. In addition, the user must be logged on, and the workstation cannot already be locked.
Das wirst du auch nicht umgehen können außer indem du im aktiven Userdesktop einen Prozess startest, der das macht.

Im Dienst funktioniert das nicht, weil es auch mehrere interaktive Desktops parallel geben könnte. Das System wüsste also nicht welche es sperren sollte.

// EDIT:
CreateProcessAsUser kannst du in Delphi einfach aufrufen, das gibt es in der Unit Windows schon.

Alternativ kannst du evtl. auch alle Sessions enumerieren (WTSEnumerateSessions) und trennen (WTSDisconnectSession), aber ich weiß nicht, ob das auch ohne RDP funktioniert.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 8. Nov 2017 um 14:40 Uhr)
  Mit Zitat antworten Zitat
361

Registriert seit: 27. Okt 2005
Ort: Berlin und Brandenburg
93 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 8. Nov 2017, 15:17
Da das Beispiel im StackOverflow zu gehen scheint, wäre mir sehr geholfen, wenn jemand ausreichende VB-Kenntnisse hätte, um die Lösung der ersten Antwort zu übersetzen. Mir gelingt es nicht, ich scheitere an dem ersten Code-Beispiel, welches ja für das dritte Code-Beispiel benötigt wird
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 8. Nov 2017, 15:36
Da das Beispiel im StackOverflow zu gehen scheint, wäre mir sehr geholfen, wenn jemand ausreichende VB-Kenntnisse hätte, um die Lösung der ersten Antwort zu übersetzen. Mir gelingt es nicht, ich scheitere an dem ersten Code-Beispiel, welches ja für das dritte Code-Beispiel benötigt wird
Bitte die Stack Overflow Antwort nochmal genau lesen und auf das EDIT in der Mitte achten!

Es sollte dann klar werden, dass er den ganzen Quark aus dem ersten Code-Beispiel nicht braucht, sondern direkt CreateProcessAsUser aufruft (drittes Code-Beispiel) mit dem Handle aus WTSQueryUserToken.

Geändert von TiGü ( 8. Nov 2017 um 15:41 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 8. Nov 2017, 16:11
Mal so runtergetippt und ungetestet:

Delphi-Quellcode:
function WTSQueryUserToken(SessionId: ULONG; phToken: PDWORD): BOOL; stdcall; external wtsapi32;
function WTSGetActiveConsoleSessionId: DWORD; stdcall; external kernel32;

procedure Test;
var
  SessionId: DWORD;
  UserTokenHandle: DWORD;
  StartInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  IsCreated: BOOL;
begin
  UserTokenHandle := 0;
  SessionId := WTSGetActiveConsoleSessionId;
  if WTSQueryUserToken(SessionId, @UserTokenHandle) then
  begin
    FillChar(StartInfo, SizeOf(StartInfo), 0);
    StartInfo.cb := SizeOf(StartInfo);
    FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);

    IsCreated := CreateProcessAsUser(
      UserTokenHandle,
      'rundll32.exe',
      'rundll32.exe user32.dll,LockWorkStation',
      nil, nil, False, 0, nil, nil,
      StartInfo, ProcessInfo);

    if not IsCreated then
      RaiseLastOSError;
  end
  else
    RaiseLastOSError;
end;
  Mit Zitat antworten Zitat
361

Registriert seit: 27. Okt 2005
Ort: Berlin und Brandenburg
93 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 9. Nov 2017, 15:12
Guten Abend TiGü,

und erst einmal vielen herzlichen Dank für Deine Mühe, weiß ich sehr zu schätzen. DANKE!

Ich habe den Code gerade getestet und erhalte folgende Fehlermeldung:
Code:
System Error. Code: 1314. Dem Client fehlt ein erforderliches Recht.
Bei Ausführung von Zeile:
Code:
if WTSQueryUserToken(SessionId, @UserTokenHandle) then
läuft in den Else-Zweig hinein, sprich liefert "False". SessionId ist "1".

Vielleicht hat noch jemand eine Idee? Ich habe einfach eine kleine VCL-Testanwendung dazu gebaut und erhielt dann den Fehler.

Viele Grüße
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 9. Nov 2017, 15:22
Vielleicht hat noch jemand eine Idee? Ich habe einfach eine kleine VCL-Testanwendung dazu gebaut und erhielt dann den Fehler.
Anhand des zweiten Satzes der MSDN-Dokumentation zu dieser Funktion hätte es mich auch schwer gewundert, wenn in einer normalen Desktop-VCL-Anwendung im User-Account etwas bei rumgekommen wäre.
  Mit Zitat antworten Zitat
361

Registriert seit: 27. Okt 2005
Ort: Berlin und Brandenburg
93 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 9. Nov 2017, 15:27
Vielleicht hat noch jemand eine Idee? Ich habe einfach eine kleine VCL-Testanwendung dazu gebaut und erhielt dann den Fehler.
Anhand des zweiten Satzes der MSDN-Dokumentation zu dieser Funktion hätte es mich auch schwer gewundert, wenn in einer normalen Desktop-VCL-Anwendung im User-Account etwas bei rumgekommen wäre.
Ich habe es auch schon gelesen, auch hier im Forum gab es schon etwas dazu. Danke. Ich teste es jetzt mal als Service.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#8

AW: Windows 10 - GetModuleHandle('USER32.DLL') & LockWorkStation funktioniert nicht

  Alt 9. Nov 2017, 15:29
Anders ausgedrückt: Du musst zusätzlich noch prüfen, ob dein Code im Dienst läuft oder nicht, und WTSQueryUserToken nur aufrufen, wenn es im Dienst ist.

Grüße
Dalai
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:42 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