Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

Methode (Process SID) klappt nur als Debug Release

  Alt 26. Nov 2019, 16:16
Hallo miteinander,
ich bin auf ein seltsames problem gestossen was mich ein wenig aus der Bahn wirft.

Referenz: stackoverflow
Code:
Delphi-Quellcode:
function GetUserAndDomainFromPID(ProcessId: DWORD;
  var User, Domain: string): Boolean;
var
  hToken: THandle;
  cbBuf: Cardinal;
  ptiUser: PTOKEN_USER;
  snu: SID_NAME_USE;
  ProcessHandle: THandle;
  UserSize, DomainSize: DWORD;
  bSuccess: Boolean;
begin
  Result := False;
  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
  if ProcessHandle <> 0 then
  begin
  // EnableProcessPrivilege(ProcessHandle, 'SeSecurityPrivilege', True);
    if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then
    begin
      bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
      ptiUser := nil;
      while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
      begin
        ReallocMem(ptiUser, cbBuf);
        bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);
      end;
      CloseHandle(hToken);

      if not bSuccess then
      begin
        Exit;
      end;

      UserSize := 0;
      DomainSize := 0;
      LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu);
      if (UserSize <> 0) and (DomainSize <> 0) then
      begin
        SetLength(User, UserSize);
        SetLength(Domain, DomainSize);
        if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize,
          PChar(Domain), DomainSize, snu) then
        begin
          Result := True;
          User := StrPas(PChar(User));
          Domain := StrPas(PChar(Domain));
        end;
      end;

      if bSuccess then
      begin
        FreeMem(ptiUser);
      end;
    end;
    CloseHandle(ProcessHandle);
  end;
end;
Bei der oben gezeigten Methode wirft mir nt.dll dauernd einen Fehler (Schreibfehler) wenn das Projekt auf "Release" steht, wenn ich nun debugge um herauszufinden an welcher stelle der Fehler produziert wird, was soll ich sagen, da klappt alles so wie es sein sollte.
Nun meine Frage, wie bekomme ich es zum laufen ohne entweder zu debuggen oder einen Debug-Release zu erschaffen, hat da jemand eine Idee?

Ps: Ich möchte mit dieser Funktion sicherstellen das meine Applikation nur einmal pro Login-Account gestartet werden kann bzw. auch gut für einen Prozess-Lister

Grüße!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat