type NET_API_STATUS = DWORD;
PLocalGroupUserInfo_0 = ^TLocalGroupUserInfo_0;
TLocalGroupUserInfo_0 = record GroupName: LPWSTR; end;
function NetUserGetLocalGroups(ServerName: LPCWSTR;UserName: LPCWSTR;Level: DWORD;Flags: DWORD;Buf: Pointer;PrefMaxLen: DWORD;var EntriesRead: DWORD;var Entries:DWORD ):NET_API_STATUS;stdCall;external 'NETAPI32.DLL';
function NetApiBufferFree(Buffer: Pointer):NET_API_STATUS;stdCall;external 'NETAPI32.DLL';
function TSecurity_WIN.GetUserGroups(const AUser: WideString): TStringList;const
NERR_Success = 0; LG_INCLUDE_INDIRECT = 1;
var wName: WideString; dwResult: DWORD; P: PLocalGroupUserInfo_0; PrefMaxLen: DWORD; EntriesRead: DWORD; TotalEntries: DWORD; I: Integer; Buf: Pointer; wGroup: WideString;begin Result := TStringList.Create; wName := AUser; PrefMaxLen := $FFFFFFFF; EntriesRead := 0; TotalEntries := 0; Buf := nil; dwResult := NetUserGetLocalGroups(nil,PWideChar(wName),0,LG_INCLUDE_INDIRECT,@Buf,PrefMaxLen,EntriesRead,TotalEntries);
if dwResult = NERR_Success then begin if Buf <> nil then begin P := PLocalGroupUserInfo_0(Buf); Result.Clear; for I := 0 to EntriesRead - 1 do begin wGroup := P^.GroupName; Result.Add(wGroup); Inc(P); end; NetApiBufferFree(Buf); end; end;end;