如何判断当前登录用户是否属于Adminitrators组,也就是判断其是否有管理员的权限?

解决方案 »

  1.   

    function IsAdmin: Boolean;
    var
      hAccessToken: THandle;
      ptgGroups: Windows.PTokenGroups;
      dwInfoBufferSize: DWORD;
      psidAdministrators: Windows.PSID;
      x: Integer;
      bSuccess: BOOL;
    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, Windows.TokenGroups, ptgGroups, 1024, dwInfoBufferSize);
           CloseHandle(hAccessToken);
           if bSuccess then
              begin
                AllocateAndInitializeSid(Windows._SID_IDENTIFIER_AUTHORITY(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;http://lysoft.7u7.net
      

  2.   

    【判断是否为超级用户】
    function IsAdmin: Boolean;
    var
      hAccessToken: THandle;
      ptgGroups: PTokenGroups;
      dwInfoBufferSize: DWORD;
      psidAdministrators: PSID;
      x: Integer;
      bSuccess: BOOL;
    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; procedure TForm1.Button1Click(Sender: TObject);
    begin
    if isAdmin then
      begin
        ShowMessage('Logged in as Administrator');
      end;
      

  3.   

    再小声问一句
    编译时显示“SECURITY_NT_AUTHORITY”等未定义,好象是在Winnt.h中定义的,在Delphi中应该如何处理?uses哪个文件?
      

  4.   

    http://search.csdn.net/Expert/topic/560/560093.xml?temp=.2662317
      

  5.   

    《Kingron's超级猛料》 中有的你的第二个问题
    --------------------------
    const
      SECURITY_BUILTIN_DOMAIN_RID = $20;
      DOMAIN_ALIAS_RID_ADMINS = $220;
      SECURITY_NT_AUTHORITY:TSIDIDENTIFIERAUTHORITY=(Value:(0,0,0,0,0,5));