Delphi - GetAccountSid

{
  Author  : http://developer.luckie-online.de
  Date    : 2005-12-12
  License : PUBLIC DOMAIN
}


function ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR): Boolean; stdcall;
    external 'advapi32.dll' name 'ConvertSidToStringSidA';

function GetAccountSid(const Server, User: WideString; var Sid: PSID): DWORD;
var
  dwDomainSize, dwSidSize: DWord;
  R                 : LongBool;
  wDomain           : WideString;
  Use               : DWord;
begin
  Result := 0;
  SetLastError(0);
  dwSidSize := 0;
  dwDomainSize := 0;
  R := LookupAccountNameW(PWideChar(Server), PWideChar(User), nil, dwSidSize,
    nil, dwDomainSize, Use);
  if (not R) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    SetLength(wDomain, dwDomainSize);
    Sid := GetMemory(dwSidSize);
    R := LookupAccountNameW(PWideChar(Server), PWideChar(User), Sid,
      dwSidSize, PWideChar(wDomain), dwDomainSize, Use);
    if not R then
    begin
      FreeMemory(Sid);
      Sid := nil;
    end;
  end
  else
    Result := GetLastError;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  SID: PSID;
  strSID: PChar;
  s: String;
  err: DWORD;
begin
  err := GetAccountSid('hal9000', 'Michael', SID);
  if err = 0 then
  begin
    if ConvertSidToStringSid(SID, strSID) then
      s := strSID
    else
      s := SysErrorMessage(err);
  end
  else
    s := SysErrorMessage(err);

  ShowMessage(s);
end;

2012-01-26T23:14:38 +0100, mail[at]michael[Bindestrich]puff.de