Определение типа учетной записи Windows [Решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Определение типа учетной записи Windows [Решено]

Сообщение novo » 31.07.2011 21:48:41

Необходимо определить является ли пользователь администратором

Нашел пример на delphi, но лазарь ругается на ptgGroups.GroupCount

пишет:

unit1.pas(125,28) Error: Illegal qualifier
unit1.pas(125,28) Hint: may be pointer dereference is missing
unit1.pas(125,28) Fatal: Syntax error, "DO" expected but "identifier GROUPCOUNT" found

помогите адаптировать под lazarus

Вот код:
Код: Выделить всё
const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
                              (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS     = $00000220;

function IsAdmin: Boolean;
var
x: integer;
bSuccess: BOOL;
hAccessToken: THandle;
ptgGroups: PTokenGroups;
dwInfoBufferSize: DWORD;
psidAdministrators: PSID;
begin
Result:=false;
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
   GetMem(ptgGroups, 1024);
   bSuccess:=GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize);
   CloseHandle(hAccessToken);
   if bSuccess
   then
    begin
     AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
       SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
       0, 0, 0, 0, 0, 0, psidAdministrators);
     {$R-}
     for x:=0 to ptgGroups.GroupCount-1 do
      if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid)
      then
       begin
        Result:=true;
        Break;
       end;
     {$R+}
    FreeSid(psidAdministrators);
   end;
  FreeMem(ptgGroups);
end;
end;
Последний раз редактировалось novo 02.10.2011 23:16:29, всего редактировалось 1 раз.
novo
новенький
 
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10

Re: Определение типа учетной записи Windows

Сообщение daesher » 31.07.2011 22:47:42

Судя по "ругани", достаточно поставить ^ перед точкой. Это же тип-указатель
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Определение типа учетной записи Windows

Сообщение novo » 01.08.2011 16:48:58

daesher спасибо, работает

Вот рабочая версия

Код: Выделить всё
const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
                              (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS     = $00000220;

function IsAdmin: Boolean;
var
x: integer;
bSuccess: BOOL;
hAccessToken: THandle;
ptgGroups: PTokenGroups;
dwInfoBufferSize: DWORD;
psidAdministrators: PSID;
begin
Result:=false;
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
   GetMem(ptgGroups, 1024);
   bSuccess:=GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize);
   CloseHandle(hAccessToken);
   if bSuccess
   then
    begin
     AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
       SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
       0, 0, 0, 0, 0, 0, psidAdministrators);
     {$R-}
     for x:=0 to ptgGroups^.GroupCount-1 do
      if EqualSid(psidAdministrators, ptgGroups^.Groups[x].Sid)
      then
       begin
        Result:=true;
        Break;
       end;
     {$R+}
    FreeSid(psidAdministrators);
   end;
  FreeMem(ptgGroups);
end;
end;     
novo
новенький
 
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru