Как получить информацию о привилегиях пользователя Windows с помощью Lazarus/Free Pascal

Используя Lazarus/Free Pascal, как я могу получить привилегии пользователя, запускающего мою программу (независимо от того, является ли он администратором, обычным пользователем или гостем)?


person Shade    schedule 27.11.2011    source источник
comment
Насколько я могу судить, вам нужно вызвать CheckTokenMembership (msdn.microsoft.com/en-us/library/windows/desktop/). Используйте DOMAIN_ALIAS_RID_ADMINS для проверки администраторов, DOMAIN_ALIAS_RID_GUESTS для гостей и DOMAIN_ALIAS_RID_USERS для обычных пользователей. Членство в группе кажется мне сложным. Используйте пример кода по ссылке MSDN выше в качестве руководства. Удачи!   -  person David Heffernan    schedule 28.11.2011


Ответы (1)


Как говорит Дэвид в комментарии, вы можете использовать CheckTokenMembership< /a> для определения принадлежности учетной записи пользователя.

проверьте этот пример, который работает на FPC и Delphi.

program Test;

{$IFDEF FPC}
  {$mode objfpc}{$H+}
{$ELSE}
  {$APPTYPE CONSOLE}
{$ENDIF}

uses
  SysUtils,
  Windows,
  Classes;

Const
 SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
 SECURITY_BUILTIN_DOMAIN_RID = $00000020;
 DOMAIN_ALIAS_RID_ADMINS     = $00000220;
 DOMAIN_ALIAS_RID_USERS      = $00000221;
 DOMAIN_ALIAS_RID_GUESTS     = $00000222;
 DOMAIN_ALIAS_RID_POWER_USERS= $00000223;

 function CheckTokenMembership(TokenHandle: THandle; SidToCheck: PSID; var IsMember: BOOL): BOOL; stdcall; external advapi32;

 function  UserInGroup(Group :DWORD) : Boolean;
 var
  pIdentifierAuthority :TSIDIdentifierAuthority;
  pSid : Windows.PSID;
  IsMember    : BOOL;
 begin
  pIdentifierAuthority := SECURITY_NT_AUTHORITY;
  Result := AllocateAndInitializeSid(pIdentifierAuthority,2, SECURITY_BUILTIN_DOMAIN_RID, Group, 0, 0, 0, 0, 0, 0, pSid);
  try
    if Result then
      if not CheckTokenMembership(0, pSid, IsMember) then //passing 0 means which the function will be use the token of the calling thread.
         Result:= False
      else
         Result:=IsMember;
  finally
     FreeSid(pSid);
  end;
 end;


begin
 Writeln(Format('Current user is Admin        %s',[BoolToStr(UserInGroup(DOMAIN_ALIAS_RID_ADMINS),True)]));
 Writeln(Format('Current user is Guest        %s',[BoolToStr(UserInGroup(DOMAIN_ALIAS_RID_GUESTS),True)]));
 Writeln(Format('Current user is Power User   %s',[BoolToStr(UserInGroup(DOMAIN_ALIAS_RID_POWER_USERS),True)]));
 readln;
end.

Также вы можете использовать WMI, проверьте Win32_UserAccount, Win32_GroupUser и Win32_Group.

person RRUZ    schedule 28.11.2011