![]() |
[Win2000] - Abmelden vom Dienst
Hallo DP,
wenn ich einen Dienst installiert habe, wie kann ich unter Windows 2000 den aktuellen Benutzer abmelden? MfG xZise |
Re: [Win2000] - Abmelden vom Dienst
Der Dienst soll den aktiven Nutzer abmelden?
|
Re: [Win2000] - Abmelden vom Dienst
Denke mal:
Benutzer personifizieren + ExitWindows könnte funktionieren. |
Re: [Win2000] - Abmelden vom Dienst
Zitat:
Was ist daran seltsam? Zitat:
![]() MfG xZise |
Re: [Win2000] - Abmelden vom Dienst
Du musst auch den Benutzer personifizieren.
|
Re: [Win2000] - Abmelden vom Dienst
Und wie macht man das am besten :)
MfG xZise |
Re: [Win2000] - Abmelden vom Dienst
Token vom User holen,
ImpersonateLoggedOnUser nutzen |
Re: [Win2000] - Abmelden vom Dienst
Zitat:
MfG xZise |
Re: [Win2000] - Abmelden vom Dienst
Aber meine Homepage:
![]() |
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 |
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. |
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?
|
Re: [Win2000] - Abmelden vom Dienst
Nein, der aktuelle Thread des Dienstes, gibt sich vorübergehend für jemand anderes aus - mit weniger Rechten usw.
|
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 |
Re: [Win2000] - Abmelden vom Dienst
Warum soll er das?
|
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 |
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. |
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 |
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 |
Re: [Win2000] - Abmelden vom Dienst
Zitat:
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. ![]() Was mich wieder zur Frage zurückbringt. Ich habe das erstmal so implementiert:
Delphi-Quellcode:
MfG
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; xZise |
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:
Noch einfacher:
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;
Delphi-Quellcode:
Beachte die Exceptions die da geworfen werden können + RaiseLastWin32Error.
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; Hoffe das hilft :cheers: |
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 |
Re: [Win2000] - Abmelden vom Dienst
Funktioniert nur mit dem ersten in der Konsole angemeldeten Benutzer.
|
Re: [Win2000] - Abmelden vom Dienst
Und was heißt in diesem Kontext "im konsole angemeldeten Benutzer"?
MfG xZise |
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. |
Re: [Win2000] - Abmelden vom Dienst
Hallo Dezipaitor,
Zitat:
Delphi-Quellcode:
MfG
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; xZise |
Re: [Win2000] - Abmelden vom Dienst
Du verwendest eine alte Version. Dieser Fehler wurde behoben und kann über Subversion beseitigt werden. Bitte mache ein
![]() |
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:
xZise |
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 |
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.). |
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:57 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