Delphi中获取当前用户sid

  1. unit GetSid;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, SysUtils;  
  7.   
  8. function GetCurrentUserSid: string;  
  9.   
  10. implementation  
  11.   
  12. const  
  13.   HEAP_ZERO_MEMORY = $00000008;  
  14.   SID_REVISION     = 1// Current revision level  
  15.   
  16. type  
  17.   PTokenUser = ^TTokenUser;  
  18.   TTokenUser = packed record  
  19.     User: TSidAndAttributes;  
  20.   end;  
  21.   
  22. function ConvertSid(Sid: PSID; pszSidText: PChar; var dwBufferLen: DWORD): BOOL;  
  23. var  
  24.   psia: PSIDIdentifierAuthority;  
  25.   dwSubAuthorities: DWORD;  
  26.   dwSidRev: DWORD;  
  27.   dwCounter: DWORD;  
  28.   dwSidSize: DWORD;  
  29. begin  
  30.   Result := False;  
  31.   
  32.   dwSidRev := SID_REVISION;  
  33.   
  34.   if not IsValidSid(Sid) then Exit;  
  35.   
  36.   psia := GetSidIdentifierAuthority(Sid);  
  37.   
  38.   dwSubAuthorities := GetSidSubAuthorityCount(Sid)^;  
  39.   
  40.   dwSidSize := (15 + 12 + (12 * dwSubAuthorities) + 1) * SizeOf(Char);  
  41.   
  42.   if (dwBufferLen < dwSidSize) then  
  43.   begin  
  44.     dwBufferLen := dwSidSize;  
  45.     SetLastError(ERROR_INSUFFICIENT_BUFFER);  
  46.     Exit;  
  47.   end;  
  48.   
  49.   StrFmt(pszSidText, 'S-%u-', [dwSidRev]);  
  50.   
  51.   if (psia.Value[0] <> 0or (psia.Value[1] <> 0then  
  52.     StrFmt(pszSidText + StrLen(pszSidText),  
  53.       '0x%.2x%.2x%.2x%.2x%.2x%.2x',  
  54.       [psia.Value[0], psia.Value[1], psia.Value[2],  
  55.       psia.Value[3], psia.Value[4], psia.Value[5]])  
  56.   else  
  57.     StrFmt(pszSidText + StrLen(pszSidText),  
  58.       '%u',  
  59.       [DWORD(psia.Value[5]) +  
  60.       DWORD(psia.Value[4shl 8) +  
  61.       DWORD(psia.Value[3shl 16) +  
  62.       DWORD(psia.Value[2shl 24)]);  
  63.   
  64.   dwSidSize := StrLen(pszSidText);  
  65.   
  66.   for dwCounter := 0 to dwSubAuthorities - 1 do  
  67.   begin  
  68.     StrFmt(pszSidText + dwSidSize, '-%u',  
  69.       [GetSidSubAuthority(Sid, dwCounter)^]);  
  70.     dwSidSize := StrLen(pszSidText);  
  71.   end;  
  72.   
  73.   Result := True;  
  74. end;  
  75.   
  76. function ObtainTextSid(hToken: THandle; pszSid: PChar;  
  77.   var dwBufferLen: DWORD): BOOL;  
  78. var  
  79.   dwReturnLength: DWORD;  
  80.   dwTokenUserLength: DWORD;  
  81.   tic: TTokenInformationClass;  
  82.   ptu: Pointer;  
  83. begin  
  84.   Result := False;  
  85.   dwReturnLength := 0;  
  86.   dwTokenUserLength := 0;  
  87.   tic := TokenUser;  
  88.   ptu := nil;  
  89.   
  90.   if not GetTokenInformation(hToken, tic, ptu, dwTokenUserLength,  
  91.     dwReturnLength) then  
  92.   begin  
  93.     if GetLastError = ERROR_INSUFFICIENT_BUFFER then  
  94.     begin  
  95.       ptu := HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, dwReturnLength);  
  96.       if ptu = nil then Exit;  
  97.       dwTokenUserLength := dwReturnLength;  
  98.       dwReturnLength    := 0;  
  99.   
  100.       if not GetTokenInformation(hToken, tic, ptu, dwTokenUserLength,  
  101.         dwReturnLength) then Exit;  
  102.     end  
  103.     else  
  104.       Exit;  
  105.   end;  
  106.   
  107.   if not ConvertSid((PTokenUser(ptu).User).Sid, pszSid, dwBufferLen) then Exit;  
  108.   
  109.   if not HeapFree(GetProcessHeap, 0, ptu) then Exit;  
  110.   
  111.   Result := True;  
  112. end;  
  113.   
  114. function GetCurrentUserSid: string;  
  115. var  
  116.   hAccessToken: THandle;  
  117.   bSuccess: BOOL;  
  118.   dwBufferLen: DWORD;  
  119.   szSid: array[0..260of Char;  
  120. begin  
  121.   Result := '';  
  122.   
  123.   bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,  
  124.     hAccessToken);  
  125.   if not bSuccess then  
  126.   begin  
  127.     if GetLastError = ERROR_NO_TOKEN then  
  128.       bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,  
  129.         hAccessToken);  
  130.   end;  
  131.   if bSuccess then  
  132.   begin  
  133.     ZeroMemory(@szSid, SizeOf(szSid));  
  134.     dwBufferLen := SizeOf(szSid);  
  135.   
  136.     if ObtainTextSid(hAccessToken, szSid, dwBufferLen) then  
  137.       Result := szSid;  
  138.     CloseHandle(hAccessToken);  
  139.   end;  
  140. end;  
  141.   
  142. end.  

发表回复

登录... 后才能评论