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 [Win2000] - Abmelden vom Dienst (https://www.delphipraxis.net/105291-%5Bwin2000%5D-abmelden-vom-dienst.html)

xZise 19. Dez 2007 10:10


[Win2000] - Abmelden vom Dienst
 
Hallo DP,
wenn ich einen Dienst installiert habe, wie kann ich unter Windows 2000 den aktuellen Benutzer abmelden?

MfG
xZise

mkinzler 19. Dez 2007 10:39

Re: [Win2000] - Abmelden vom Dienst
 
Der Dienst soll den aktiven Nutzer abmelden?

Dezipaitor 19. Dez 2007 11:42

Re: [Win2000] - Abmelden vom Dienst
 
Denke mal:
Benutzer personifizieren + ExitWindows
könnte funktionieren.

xZise 19. Dez 2007 14:25

Re: [Win2000] - Abmelden vom Dienst
 
Zitat:

Zitat von mkinzler
Der Dienst soll den aktiven Nutzer abmelden?

Ja?
Was ist daran seltsam?


Zitat:

Zitat von Dezipaitor
Denke mal:
Benutzer personifizieren + ExitWindows
könnte funktionieren.

Ersteres würde gehen, aber ExitWindows ist so eine Sache (siehe).

MfG
xZise

Dezipaitor 19. Dez 2007 15:12

Re: [Win2000] - Abmelden vom Dienst
 
Du musst auch den Benutzer personifizieren.

xZise 19. Dez 2007 15:18

Re: [Win2000] - Abmelden vom Dienst
 
Und wie macht man das am besten :)

MfG
xZise

Dezipaitor 19. Dez 2007 16:00

Re: [Win2000] - Abmelden vom Dienst
 
Token vom User holen,
ImpersonateLoggedOnUser nutzen

xZise 19. Dez 2007 17:26

Re: [Win2000] - Abmelden vom Dienst
 
Zitat:

Zitat von Dezipaitor
[...]
ImpersonateLoggedOnUser nutzen

Was ist das? Die DP kennt das nicht :)

MfG
xZise

Luckie 19. Dez 2007 17:29

Re: [Win2000] - Abmelden vom Dienst
 
Aber meine Homepage: http://www.michael-puff.de/Artikel/2...ersonate.shtml ;)

xZise 19. Dez 2007 18:36

Re: [Win2000] - Abmelden vom Dienst
 
Hallo,
ich habe ein kleines Problem :)
Und zwar was bringt mir impersonateUser?

Ich habe nur einen Benutzernamen, aber kein Passwort. Aber der Benutzer ist ja eh angemeldet... Könnte ich da das Token von der JWSCL nehmen, welches ich von den Benutzer bekomme?

Und ich muss Impersonate in einer externen exe bzw. Thread machen, oder?

MfG
xZise

Dezipaitor 19. Dez 2007 19:33

Re: [Win2000] - Abmelden vom Dienst
 
unter Windows 2000 muss man über einen Prozess das Token des Benutzers erfahren (TJwSecurityToken.CreateCompatibilityQueryUserToke n).

Man kann das Token dann sofort personifizieren (impersonate), da jeder Prozess mindestens ein Thread besitzt.

xZise 19. Dez 2007 20:50

Re: [Win2000] - Abmelden vom Dienst
 
Dann würde also der Dienst zu einen Prozess des Benutzers? Oder wie sage ich, dass ein anderer Prozess ein Benutzer gehört?

Dezipaitor 19. Dez 2007 20:57

Re: [Win2000] - Abmelden vom Dienst
 
Nein, der aktuelle Thread des Dienstes, gibt sich vorübergehend für jemand anderes aus - mit weniger Rechten usw.

xZise 19. Dez 2007 21:21

Re: [Win2000] - Abmelden vom Dienst
 
Ah Okay...
Ist natürlich doof, dass der Dienst sich lieber beenden sollte, wenn das zurückgschalten fehlschlägt ...

MfG
xZise

Dezipaitor 20. Dez 2007 10:18

Re: [Win2000] - Abmelden vom Dienst
 
Warum soll er das?

xZise 15. Apr 2008 15:45

Re: [Win2000] - Abmelden vom Dienst
 
Ich weiß zwar nicht mehr sogenau, warum ich das gesagt habe ;)

Aber eigentlich habe ich da eine Frage: Wie lange bin ich der andere Benutzer?
Und sind Dienste vom abmelden betroffen, wenn diese im Kontext des abmeldenden Benutzers ausgeführt werden?

MfG
xZise

Dezipaitor 15. Apr 2008 15:53

Re: [Win2000] - Abmelden vom Dienst
 
Das Tokenhandle ist unabhängig von der interaktiven Anmeldung. Solange ein Handle auf ein Token besteht, solange bleibt das Token erhalten. Da kann der Benutzer sich 50x abmelden.
Gehe aber nicht davon aus, dass Netzwerklaufwerke oder andere Resourcen verfügbar sind. Das Benutzerprofil könnte auch entladen werden. Die Registrykeys müssen mit LoadUserProfile extra geladen werden.

xZise 15. Apr 2008 16:51

Re: [Win2000] - Abmelden vom Dienst
 
Naja, ich möchte eigentlich nur den aktuell angemeldeten Benutzer abmelden, also so, als würde er auf Start klciken und "Abmelden" anwählen.
Und wie komme ich mit den TJwSecurityToken an das Token zum Impersonisieren?

MfG
xZise

xZise 16. Apr 2008 21:27

Re: [Win2000] - Abmelden vom Dienst
 
Also ich wüsste schon gerne, wie ich es hinkriege, dass ich als installierter Service unter den Benutzer "NT-Autorität" den aktuell aktiven Benutzer abmelden kann ;)

MfG
xZise

xZise 28. Mär 2009 11:20

Re: [Win2000] - Abmelden vom Dienst
 
Zitat:

Zitat von xZise
[...]Ist natürlich doof, dass der Dienst sich lieber beenden sollte, wenn das zurückgschalten fehlschlägt[...]

Ha ich weiß jetzt wieder, warum ich das gesagt habe :)

Ein Prozess unter einem anderem Benutzer ausführen - Teil 1 Impersonate
Mit der Funktion RevertToSelf wird die Verkörperung eines anderen Benutzers wieder aufgehoben. Aus Sicherheitsgründen sollte man den Prozess beenden, wenn diese Funktion fehlschlägt, da sonst der Prozess weiter unter den Benutzerrechten des anderen Benutzers ausgeführt wird.
(Siehe hier)

Was mich wieder zur Frage zurückbringt. Ich habe das erstmal so implementiert:
Delphi-Quellcode:
token := TJwSecurityToken.CreateWTSQueryUserToken(TOKEN_ALL_ACCESS);
try
  if ImpersonateLoggedOnUser(token.TokenHandle) then
  begin
    vi.dwOSVersionInfoSize:=SizeOf(vi);
    GetVersionEx(vi);
    if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then // Windows NT
    begin
      OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hToken);
      LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
      tp.PrivilegeCount := 1;
      tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      h := 0;
      AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^,h);
      CloseHandle(hToken);
      Result := ExitWindowsEx(flag,0);
    end;
  end;
finally
  token.Free;
end;
MfG
xZise

Dezipaitor 28. Mär 2009 12:31

Re: [Win2000] - Abmelden vom Dienst
 
Das sollte man lieber nicht so machen. Du personifizierst den aktuellen Benutzer und schaltest das Privileg aber vom Prozess.
Weiterhin kann JWSCL alles, was du da verwendet hast (mit Winapi)

Schau mal hier:
Delphi-Quellcode:
uses
  JwaWindows,
  JwsclToken,
  JwsclTypes,
  JwsclComUtils,
  JwsclVersion,
  JwsclUtils,
  JwsclPrivileges;


procedure ImpersonateAndExecute(const Flag : DWORD);
var
  Token : TJwSecurityToken;
  PrivScope : IJwPrivilegeScope;
begin
  //raises EJwsclUnsupportedWindowsVersionException
  // EJwsclPrivilegeCheckException, EJwsclWinCallFailedException
  Token := TJwSecurityToken.CreateWTSQueryUserToken(TOKEN_ALL_ACCESS);
  TJwAutoPointer.Wrap(Token);

  //raises EJwsclAccessTypeException, EJwsclSecurityException
  Token.ImpersonateLoggedOnUser;

  try
    if TJwWindowsVersion.IsWindows2000(true) then
    begin
      //raises EJwsclPrivilegeException
      PrivScope := JwGetPrivilegeScope([SE_SHUTDOWN_NAME]);

      if not ExitWindowsEx(Flag,0) then
        RaiseLastWin32Error;
    end;
  finally
    Token.RevertToSelf;
  end;
end;
Noch einfacher:
Delphi-Quellcode:
uses
  JwaWindows,
  JwsclImpersonation,
  JwsclTypes,
  JwsclComUtils,
  JwsclVersion,
  JwsclUtils,
  JwsclPrivileges,
  SysUtils;

procedure ImpersonateAndExecute(const Flag : DWORD);
var
  Imp : IJwImpersonation;
  PrivScope : IJwPrivilegeScope;
begin
  //raises EJwsclProcessIdNotAvailable
  //EJwsclWinCallFailedException
  Imp := JwImpersonateLoggedOnUser;

  if TJwWindowsVersion.IsWindows2000(true) then
  begin
    //raises EJwsclPrivilegeException
    PrivScope := JwGetPrivilegeScope([SE_SHUTDOWN_NAME]);

    if not ExitWindowsEx(Flag,0) then
      RaiseLastOSError;
  end;
end;
Beachte die Exceptions die da geworfen werden können + RaiseLastWin32Error.

Hoffe das hilft :cheers:

xZise 29. Mär 2009 15:46

Re: [Win2000] - Abmelden vom Dienst
 
Hallo Dezipaitor (diesmal kopiert ^^ ),
also ich habe vergessen zu erwähnen :oops: das wir inzwischen mit Windows XP arbeiten. Was könnte das für Änderungen im Code nach sich ziehen?

MfG
xZise

Dezipaitor 29. Mär 2009 15:57

Re: [Win2000] - Abmelden vom Dienst
 
Funktioniert nur mit dem ersten in der Konsole angemeldeten Benutzer.

xZise 29. Mär 2009 16:25

Re: [Win2000] - Abmelden vom Dienst
 
Und was heißt in diesem Kontext "im konsole angemeldeten Benutzer"?

MfG
xZise

Dezipaitor 29. Mär 2009 16:29

Re: [Win2000] - Abmelden vom Dienst
 
Das Token kommt von
demjenigen Benutzer, der sich zuerst direkt per Tastatur anmeldet. Wenn er FUS verwendet oder einfach per RDP angemeldet hat, funktioniert es so nicht.

xZise 30. Mär 2009 16:46

Re: [Win2000] - Abmelden vom Dienst
 
Hallo Dezipaitor,

Zitat:

An Exception of type EJwsclProcessIdNotAvailable was raised.
(Data was given by programmer and can vary from actual source.)
Source method....: Create
Source class.....: TJwImpersonation
Source file......: JwsclImpersonation.pas
Source line......: 0
GetLastError.....: 1400 ($578)
GetLastErrorMsg..: Ungültiges Fensterhandle

Message : The process "Progman1" (Id: 0x0) could not be found.
mit folgenden Code:
Delphi-Quellcode:
function ImpersonateAndExecute(const Flag : DWORD) : Boolean;
var
  Imp : IJwImpersonation;
  PrivScope : IJwPrivilegeScope;
begin
  Result := true;
  try
    //raises EJwsclProcessIdNotAvailable
    //EJwsclWinCallFailedException
    Imp := JwImpersonateLoggedOnUser;

    if TJwWindowsVersion.IsWindows2000(true) then
    begin
      //raises EJwsclPrivilegeException
      PrivScope := JwGetPrivilegeScope([SE_SHUTDOWN_NAME]);

      if not ExitWindowsEx(Flag, 0) then
        RaiseLastOSError;
    end else
      AddToLog('Not W2k+');
  except
    on e: Exception do
    begin
      AddToLog(e.Message);
//    on e : EJwsclProcessIdNotAvailable do
      Result := false;
//    on e : EJwsclWinCallFailedException do
      Result := false;
    end;
  end;
end;
MfG
xZise

Dezipaitor 30. Mär 2009 19:29

Re: [Win2000] - Abmelden vom Dienst
 
Du verwendest eine alte Version. Dieser Fehler wurde behoben und kann über Subversion beseitigt werden. Bitte mache ein Subversion-Update (z.b. mit TortoiseSVN)

xZise 31. Mär 2009 17:17

Re: [Win2000] - Abmelden vom Dienst
 
Okay also Herunterfahren funktioniert schonmal. Wegen den Abmelden gibt es noch das Problem, dass ich zuerst den Benutzername benötige, der aber leider noch nicht funktioniert.
Okay inzwischen tut es das, aber es gibt folgenden Fehler:
Zitat:

Systemfehler. Code: 1.
Unzulässige Funktion
MfG
xZise

xZise 1. Apr 2009 16:24

Re: [Win2000] - Abmelden vom Dienst
 
Hallo ich bin es nochmal.

Und ich wollte sagen, dass mich an dem Code wundert, das die Variable "Imp" nicht verwendet wird?

MfG
xZise

Dezipaitor 1. Apr 2009 19:24

Re: [Win2000] - Abmelden vom Dienst
 
Die wird am Ende von Delphi zerstört - Interface eben.

Ich weiß aber gerade nicht, ob die Variable überhaupt benötigt wird - kann es mir aber gut vorstellen, da das Ignorieren des Rückgabewertes die Variable zerstört (mglw.).

xZise 2. Apr 2009 13:15

Re: [Win2000] - Abmelden vom Dienst
 
Moin,

Naja, aber das bringt mich leider nicht weiter, warum gerade da der Fehler auftritt. Ich werden jetzt mal versuchen den einzugrenzen und ansonsten wüsste ich jetzt nicht woran es hapert, da wenn ich als Flag herunterfahren übergebe es funktioniert.

MfG
xZise


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