Delphi中获取当前用户Sid

2022-12-29 10:51:08 作者:admin

本文整理自网络,侵删。

 unit GetSid;    interface    uses    Windows, SysUtils;    function GetCurrentUserSid: string;    implementation    const    HEAP_ZERO_MEMORY = $00000008;    SID_REVISION     = 1; // Current revision level    type    PTokenUser = ^TTokenUser;    TTokenUser = packed record      User: TSidAndAttributes;    end;    function ConvertSid(Sid: PSID; pszSidText: PChar; var dwBufferLen: DWORD): BOOL;  var    psia: PSIDIdentifierAuthority;    dwSubAuthorities: DWORD;    dwSidRev: DWORD;    dwCounter: DWORD;    dwSidSize: DWORD;  begin    Result := False;      dwSidRev := SID_REVISION;      if not IsValidSid(Sid) then Exit;      psia := GetSidIdentifierAuthority(Sid);      dwSubAuthorities := GetSidSubAuthorityCount(Sid)^;      dwSidSize := (15 + 12 + (12 * dwSubAuthorities) + 1) * SizeOf(char);      if (dwBufferLen < dwSidSize) then    begin      dwBufferLen := dwSidSize;      SetLastError(ERROR_INSUFFICIENT_BUFFER);      Exit;    end;      StrFmt(pszSidText, ‘S-%u-‘, [dwSidRev]);      if (psia.Value[0] <> 0) or (psia.Value[1] <> 0) then      StrFmt(pszSidText + StrLen(pszSidText),        ‘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(pszSidText + StrLen(pszSidText),        ‘%u’,        [DWORD(psia.Value[5]) +        DWORD(psia.Value[4] shl 8) +        DWORD(psia.Value[3] shl 16) +        DWORD(psia.Value[2] shl 24)]);      dwSidSize := StrLen(pszSidText);      for dwCounter := 0 to dwSubAuthorities ?C 1 do    begin      StrFmt(pszSidText + dwSidSize, ‘-%u’,        [GetSidSubAuthority(Sid, dwCounter)^]);      dwSidSize := StrLen(pszSidText);    end;      Result := True;  end;    function ObtainTextSid(hToken: THandle; pszSid: PChar;    var dwBufferLen: DWORD): BOOL;  var    dwReturnLength: DWORD;    dwTokenUserLength: DWORD;    tic: TTokenInformationClass;    ptu: Pointer;  begin    Result := False;    dwReturnLength := 0;    dwTokenUserLength := 0;    tic := TokenUser;    ptu := nil;      if not GetTokenInformation(hToken, tic, ptu, dwTokenUserLength,      dwReturnLength) then    begin      if GetLastError = ERROR_INSUFFICIENT_BUFFER then      begin        ptu := HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, dwReturnLength);        if ptu = nil then Exit;        dwTokenUserLength := dwReturnLength;        dwReturnLength    := 0;          if not GetTokenInformation(hToken, tic, ptu, dwTokenUserLength,          dwReturnLength) then Exit;      end      else        Exit;    end;      if not ConvertSid((PTokenUser(ptu).User).Sid, pszSid, dwBufferLen) then Exit;      if not HeapFree(GetProcessHeap, 0, ptu) then Exit;      Result := True;  end;    function GetCurrentUserSid: string;  var    hAccessToken: THandle;    bSuccess: BOOL;    dwBufferLen: DWORD;    szSid: array[0..260] of char;  begin    Result := ”;      bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,      hAccessToken);    if not bSuccess then    begin      if GetLastError = ERROR_NO_TOKEN then        bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,          hAccessToken);    end;    if bSuccess then    begin      ZeroMemory(@szSid, SizeOf(szSid));      dwBufferLen := SizeOf(szSid);        if ObtainTextSid(hAccessToken, szSid, dwBufferLen) then        Result := szSid;      CloseHandle(hAccessToken);    end;  end;    end.   

相关阅读 >>

Delphi木马生成技术

wmi技术介绍和应用

Delphi中控制与捕捉输入法的实现单元

Delphi中exit,abort,break,continue的区别介绍

Delphi 用updateresource修改exe文件图标(已修正)

Delphi 突破主动防御

Delphi 如何在桌面添加右键菜单

解放程序员!Delphi带来app开发革命

Delphi now、date、time、currentyear - 当前日期

Delphi 读取文件获取指定字符串

更多相关阅读请进入《Delphi》频道 >>



在线咨询 拨打电话