![]() |
Angemeldeten Benutzer aus Dienst ermitteln
Hi DP,
ich habe eine Frage, und zwar wie kann ich den aktuell angemeldeten Benutzer ermitteln? Ich habe schon im Forum gesucht, und dort wurde die Variable "username" empfohlen. Ich habe das eingebaut, und als Anwendung funzt es, aber in einem Dienst bekomme ich nur einen Leerstring. MfG xZise [edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit] |
Re: Angemeldeter Benutzer aus Dienst ermitteln
|
Re: Angemeldeter Benutzer aus Dienst ermitteln
Leider kann ich kein C++ ;)
|
Re: Angemeldeter Benutzer aus Dienst ermitteln
Da gibt es nicht viel C zu können. Die API-Funktionen sind die gleichen.
|
Re: Angemeldeter Benutzer aus Dienst ermitteln
Lustige Sache:
Es können mehrere Benutzer gleichzeit angemeldet sein :D mit den Notification, wie es in dem C++ Artikel auf codeproject gezeigt wird, kann man nur dann reagieren, wenn der Dienst schon von anfang an gestartet ist - sonst bekommt man keine Nachricht. Am einfachsten geht es, wenn man WTSQueryUserToken aus der JWSCL verwendet. Man kann bestimmen, welche Session (lokal, remote) verwendet werden soll und mit dem Token hat soviele Infos über dem Benutzer (Name, SID, usw), dass es reichen sollte. Man kann sogar den Userkontext übernehmen und als Dienst unter diesem Benutzer lustige Dinge machen. |
Re: Angemeldeter Benutzer aus Dienst ermitteln
So... Ich habe nun versucht das zu übersetzen, aber es gibt mehrere Probleme:
Delphi-Quellcode:
library logonoffdll;
const g_szPath : array of PChar =('c:\somepath\execut.exe \"arguments\"'); uses SysUtils, Classes, Windows; {$R *.res} function LinMain(hInst : hInstance; dwReas : DWord; lpReserved : LPVoid) : Boolean; var g_pi : PROCESS_INFORMATION; begin if dwReas = DLL_PROCESS_ATTACH then DisableThreadLibraryCalls(hInst); Result := true; end; procedure StartProcessAtWinLogon(pInfo : PWLX_NOTIFICATION_INFO); var si : STARTUPINFO; begin si.cb := sizeof(STARTUPINFO); si.lpReserved := nil; si.lpTitle := nil; si.lpDesktop := 'WinSta0\\Default'; si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L; si.dwFlags := 0;; si.wShowWindow := SW_SHOW; si.lpReserved2 := NULL; si.cbReserved2 := 0; CreateProcess(NULL, g_szPath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &g_pi); end; procedure StopProcessAtWinLogoff(pInfo : PWLX_NOTIFICATION_INFO); begin SafeTerminateProcess(g_pi.hProcess, 0xDEADBEEF); end; procedure YOUR_EVENT_HANDLERS (pInfo : PWLX_NOTIFICATION_INFO); begin // ??? end; export StartProcessAtWinLogon, StopProcessAtWinLogoff; begin end.
Zitat:
Zitat:
Zitat:
[edit]Ich verzweifle :( Ich habe die Unit gedownloadet, aber mehr auch nicht, weil ich kein einziges Beispiel kompilieren kann, weil die Datei JwaWinType.pas von einen andere Prozess verwendet wird (jedenfalls sagt das TD-E). Also kann ich nicht JwaWindows.pas komplieren, und damit nicht whoami (was wahrscheinlich das Beispiel dazu ist?). Warum es nicht geht: kA :( Ich weiß nur, dass ich sie öffnen konnte, bevor Delphi zu der Zeile {$I JwaWinType.pas} kam... TD-E eben ^^ irrational ...[/edit] MfG xZise |
Re: Angemeldeter Benutzer aus Dienst ermitteln
Zitat:
Guck mal bei ![]() P.S. Wenn du so eine Meldung per Edit einfügst, wird niemand benachrichtigt und es ist nur Zufall, wenn man deinen Post liest. |
Re: Angemeldeter Benutzer aus Dienst ermitteln
Zitat:
Zitat:
MfG xZise PS: Kann man irgendwie ein Dienst schnell testen? Also ohne die ganzen Reboots? |
Re: Angemeldeter Benutzer aus Dienst ermitteln
Zitat:
Wenn du etwas schreiben willst, dann kannste ja gleich einen neuen Post machen, statt zu pushen. Edits sollten eh nur für Kleinigkeiten sein. |
Re: Angemeldeter Benutzer aus Dienst ermitteln
So... Dienst installiert, gestartet und getestet mit folgenden Code:
Delphi-Quellcode:
Ergebnis: Administratoren
function GetUserName : string;
var sl : TStringList; Token : TJwSecurityToken; begin Token := TJwSecurityToken.CreateTokenEffective(TOKEN_READ); try Result := Token.TokenOwner.AccountName['']; finally Token.Free; end; end; Auch wenn keine Admins/niemand angemeldet sind. Habe ich die falsche Variable genommen? MfG xZise [edit]
Delphi-Quellcode:
Was soll ich da übergeben :)[/edit]
JwaWtsApi32.WTSQueryUserToken(????);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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