Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Eigener Dienst -> Speicherauslastung wächst und wächst... (https://www.delphipraxis.net/112046-eigener-dienst-speicherauslastung-waechst-und-waechst.html)

cherry 22. Apr 2008 16:07

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
habs jetzt mal so...

Delphi-Quellcode:
function TSisterWatch.GetSession: string;
begin
  try
   Token := TJwSecurityToken.CreateWTSQueryUserToken(WtsGetActiveConsoleSessionID);
//   Token := TJwSecurityToken.CreateCompatibilityQueryUserToken(MAXIMUM_ALLOWED, 'explorer.exe');
   Token.ImpersonateLoggedOnUser;
   //do stuff on user’s behalf
   Result := Token.GetTokenUserName;
  except
   Result := '';
  end;
  Token.RevertToSelf;
  Token.Free;
end;
:dancer2: --> Ohne wachsende Speicherauslastung

scheint aber "nur" als dienst (systemkonto) zu funktionieren!!! -> Habs zuerst als normales Programm getestet... ist das normal?
muss jetzt leider gleich weg... versuche morgen noch mit der Ex Version.... bei der Ex Version muss man noch nen Terminalserver angeben als Parameter, geht das also auch Remote? nehm ich an...

Dezipaitor 22. Apr 2008 16:18

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
1. ha das benötigt einen Dienst!
2. ImpersonateLoggedonuser ist hier nicht mehr nötig!

hoika 22. Apr 2008 16:38

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
Hallo,

Delphi-Quellcode:
function GetCurrUserName: string;
var
  Size             : DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    SetLength(Result, Size)
  else
    Result := '';
end;
das sieht nicht gut aus !


Delphi-Quellcode:
function GetCurrUserName: string;
var
  Size     : DWORD;
  sUserName : String;
begin
  Result:= '';

  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(sUserName, Size);
  if GetUserName(PChar(sUserName), Size) then Result:= sUserName;
end;

Heiko

cherry 23. Apr 2008 08:29

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
also ich krieg das mit Ex nicht hin... Ich weiss nicht welche Parameter?!

CreateWTSQueryUserTokenEx

Delphi-Quellcode:
Token := TJwSecurityToken.CreateWTSQueryUserTokenEx(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION);
Delphi-Quellcode:
Token := TJwSecurityToken.CreateWTSQueryUserTokenEx(WTS_CURRENT_SERVER_HANDLE, WtsGetActiveConsoleSessionID);
geht aber beides nicht... ich denke es liegt am ersten Parameter Server:TObject

Zitat:

defines the Terminal Server where this function will be processed. Define be WTS_CURRENT_SERVER_HANDLE to use current server
wie muss ich das parametrisiseren? - Also ich kann den Code nichtmal kompillieren:

[Pascal Fehler] main.pas(371): E2250 Es gibt keine überladene Version von 'CreateWTSQueryUserTokenEx', die man mit diesen Argumenten aufrufen kann

Dezipaitor 23. Apr 2008 09:48

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
Uh ja das ist mein Fehler. Im parallelen branch hab ich die Doku dazu schon angepasst. Nimm als erster parameter nil. Normal kommt da sonst TJwTerminalServer Objekt rein. Ich hab auch den Blog angepasst.

Remko 28. Apr 2008 23:38

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
The leak seems to be in WTSAPI32.DLL and specifically in the function WTSQuerySessionInformation with information classes WTSInitialProgram and WTSApplicationName.
You can test by looking up this part of JwsclTerminalServer:
Delphi-Quellcode:
constructor TJwWTSSession.Create(const Owner: TJwWTSSessionList;
  const SessionId: TJwSessionId; const WinStationName: TJwString;
  const ConnectState: TWtsConnectStateClass);
and comment out these lines:
Delphi-Quellcode:
  FApplicationName := GetSessionInfoStr(WTSApplicationName);
  FInitialProgram := GetSessionInfoStr(WTSInitialProgram);
Windows Vista and XP seem to suffer, 2003 server seems to be ok.

cherry 29. Apr 2008 07:26

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
ich habs jetzt mal so gemacht...

Delphi-Quellcode:
function TSisterWatch.GetSession: string;
begin
  try
   Token := TJwSecurityToken.CreateWTSQueryUserTokenEx(nil{or a TJwTerminalServer object}, WtsGetActiveConsoleSessionID);
   // Token.ImpersonateLoggedOnUser; <- Its not necessary
   //do stuff on user’s behalf
   Result := Token.GetTokenUserName;
  except
   Result := '';
  end;
  Token.RevertToSelf;
  Token.Free;
end;
1'000'000'000 Dank euch allen! Scheint prima zu funktionieren.

cherry 29. Apr 2008 08:17

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
hehe... hab grad folgendes festgestellt...

(Ich überprüfe ja jede Sekunde einmal, ob der Benutzer gewechselt hat. mir der Funktion GeSession von oben...)

Wenn ich jetzt den Dienst auf einem Rechner laufen habe funktioniert das super. Melde ich mich jetzt aber remote an diesem Rechner an (RDP), wirft die die Funktion GetSession folgende Fehlermeldung :

Zitat:

An Exception of type EJwsclWinCallFailedException was raised.
(Data was given by programmer and can vary from actual source.)
Source method....: WinStationQueryUserToken
Source class.....: TJwSecurityToken
Source file......: JwsclToken.pas
Source line......: 0
GetLastError.....: 1008 ($3F0)
GetLastErrorMsg..: Es wurde versucht, auf ein Token zuzugreifen, das nicht vorhanden ist.


Message : A call to WTSQueryUserToken failed. Session ID: 4
Meine Fragen jetzt: Bei welchen anderen "sachen" kann das auch noch passieren? VNC? usw?
wie würdet ihr das behandeln? -> ich meine ich will ja herausfinden wann sich ein anderer Benutzer angemeldet hat und solange ich eine RDP session habe, ists je eh immer der gleiche Benutzer. Also nicht weiter tragisch, oder wie seht ihr das?

Remko 29. Apr 2008 09:30

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
Only the system account is allowed to retreive the token (since it is the user's primary access token). So my question is are you retreiving the token as system or as user/administrator?

PS: see my post above, maybe you can revert to the original code?

Remko 1. Mai 2008 09:36

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
Zitat:

Ich überprüfe ja jede Sekunde einmal, ob der Benutzer gewechselt hat
I that case I advise to use WTSRegisterSessionNotification function which informs you about that (so you don't have to check this every second)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr.
Seite 4 von 5   « Erste     234 5      

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 by Thomas Breitkreuz