Get User SID - Delphi

DarkCoderSc personal avatar
DarkCoderSc

Jean-Pierre LESUEUR

uses
  System.SysUtils, Winapi.Windows;

// ...

type
  TSidNameUse = (
                  SidTypeUser,
                  SidTypeGroup,
                  SidTypeDomain,
                  SidTypeAlias,
                  SidTypeWellKnownGroup,
                  SidTypeDeletedAccount,
                  SidTypeInvalid,
                  SidTypeUnknown,
                  SidTypeComputer,
                  SidTypeLabel,
                  SidTypeLogonSession
  );

// ...

function GetUserSidByType(const AUserName : String; ASidType : TSidNameUse = SidTypeUser) : String;
begin
  result := '';
  ///

  var ASidSize       := DWORD(0);
  var ARefDomainSize := DWORD(0);

  var ASidNameUse := Cardinal(ASidType);

  if not LookupAccountNameW(nil, PWideChar(AUserName), nil, ASidSize, nil, ARefDomainSize, ASidNameUse) then
    if GetLastError <> 122 (* Buffer Too Small *) then
      raise EWindowsException.Create('LookupAccountNameW(1)');

  var ptrSID : PSID;

  GetMem(ptrSID, ASidSize);
  try
    var ARefDomain : String;
    SetLength(ARefDomain, ARefDomainSize);

    var ARet := LookupAccountNameW(
        nil,
        PWideChar(AUserName),
        ptrSID,
        ASidSize,
        PWideChar(ARefDomain),
        ARefDomainSize,
        ASidNameUse
    );
    if not ARet then
      raise EWindowsException.Create('LookupAccountNameW(2)');

    var ASid : PWideChar;
    ConvertSidToStringSidW(ptrSID, ASid);
    try
      result := String(ASid);
    finally
      LocalFree(ASid);
    end;
  finally
    FreeMem(ptrSID, ASidSize);
  end;
end;

// ...

WriteLn(GetUserSidByType('darkcodersc'));

Implemented By Technique


Created

April 13, 2025

Last Revised

April 13, 2025