Добавить комментарий

Delphi

Получить SID текущего пользователя

uses
   Winapi.Windows, System.SysUtils;
...
// Преобразование SID-а в строку.
function ConvertSid(Sid: PSID; aBuffer: PChar; var BufLen: integer): Boolean;
var
  psia: PSIDIdentifierAuthority;
  SubAuthoritiesCount : Byte;
  i: integer;
  SidSize: integer;
begin
  Result := False;

  if not IsValidSid(Sid) then Exit;

  psia := GetSidIdentifierAuthority(Sid);
  SubAuthoritiesCount := GetSidSubAuthorityCount(Sid)^;
  SidSize := (15 + 12 + (12 * SubAuthoritiesCount) + 1) * SizeOf(Char);

  if (BufLen < SidSize) then
  begin
    BufLen := SidSize;
    SetLastError(ERROR_INSUFFICIENT_BUFFER);
    Exit;
  end;

  StrFmt(aBuffer, 'S-%u-', [1]); // 1- номер текущей ревизии формата SID

  if (psia.Value[0] <> 0) or (psia.Value[1] <> 0) then
    StrFmt(aBuffer + StrLen(aBuffer),
      '0x%.2x%.2x%.2x%.2x%.2x%.2x',
      [psia.Value[0], psia.Value[1], psia.Value[2],
      psia.Value[3], psia.Value[4], psia.Value[5]])
  else
    StrFmt(aBuffer + StrLen(aBuffer),
      '%u',
      [DWORD(psia.Value[5]) +
      DWORD(psia.Value[4] shl 8) +
      DWORD(psia.Value[3] shl 16) +
      DWORD(psia.Value[2] shl 24)]);

  SidSize := StrLen(aBuffer);

  for i := 0 to SubAuthoritiesCount - 1 do
  begin
    StrFmt(aBuffer + SidSize, '-%u',
      [GetSidSubAuthority(Sid, i)^]);
    SidSize := StrLen(aBuffer);
  end;

  Result := True;
end;

// Получение SID-а по Токену
function GetTextSid(aToken: THandle; aBuffer: PChar; var aBufLen: integer): Boolean;
var
  TokenLength: Cardinal;
  tic: TTokenInformationClass;
  ptu: Pointer;
begin
  Result := False;
  TokenLength := 0;
  tic := TokenUser;
  ptu := nil;
  // Запрашиваем токен в буфер нулевой длины,
  //   чтобы узнать требуемый размер буфера.
  if not GetTokenInformation(aToken, tic, ptu, TokenLength, TokenLength) then
  begin
    // Если недостаток памяти - наша единственная проблема
    if GetLastError = ERROR_INSUFFICIENT_BUFFER then
    begin
      // резервируем нужное количество
      GetMem(ptu, TokenLength);
      try
        // и делаем вторую попытку.
        if GetTokenInformation(aToken, tic, ptu, TokenLength, TokenLength)
          then Result := ConvertSid((PTokenUser(ptu).User).Sid, aBuffer, aBufLen);
      finally
        FreeMem(ptu, TokenLength);
      end;
    end;
  end;
end;


function GetCurrentUserSid: string;
var
  hAccessToken: THandle;
  success : Boolean;
  bufLen  : integer;
  buffer  : array[0..260] of Char;
begin
  Result := '';
  // Получаем токен текущего юзера
  success := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken);
  if not(Success) then
  begin
    if GetLastError = ERROR_NO_TOKEN then
      Success := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken);
  end;

  if success then
  begin
    Try
      // Готовим буфер 
      ZeroMemory(@buffer, SizeOf(buffer));
      bufLen := SizeOf(buffer);
      // Получаем SID в буфер
      if GetTextSid(hAccessToken, buffer, bufLen) then
        Result := buffer;
    Finally
      CloseHandle(hAccessToken);
    End;
  end;
end;
Метки:

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.