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;