有没有判断用户是否是Administrator的API

解决方案 »

  1.   

    http://www.518sf.cn/blog/article.asp?id=55
      

  2.   

    我的机器是Win2003呀,运行以后没有反应,有没有可以在Win2003上运行的判断方法
      

  3.   

    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;  
      

  4.   

    1楼的程序在WINXP下和2000下能通过
      

  5.   

    直接取出用户名不行吗?怎么这么复杂?procedure TForm1.Button1Click(Sender: TObject);
    function getMyName : string;
    var
      buf: array[0..255] of char;
      i: DWORD;
    begin
      i := 256;
      GetUserName(buf,i);
      result := buf;
    end;
    begin
      ShowMessage(getMyName);
    end;
      

  6.   

    哦,好像楼主没有说清楚,到底是用户名是"Administrator"还是属于Administrator
      

  7.   

    是具有Administrator的权限的用户
      

  8.   

    呵呵,全部贴进去当然不行,这样吧,你增加一个Button,Name为Button1,然后双击一下Button1,写入
    if IsAdmin then 
      ShowMessage('Is Admin')
    else
      ShowMessage('Is Not Admin!');然后在前面加上
    Function IsAdmin: Boolean;
    Const
      SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (value: (0, 0, 0, 0, 0, 5));
      SECURITY_BUILTIN_DOMAIN_RID = $00000020;
      DOMAIN_ALIAS_RID_ADMINS = $00000220;
    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;
      

  9.   

    我说的“然后在前面加上”是指在procedure TForm1.Button1Click(Sender: TObject);前面加上那个判断函数
      

  10.   

    贝宝电子银行(活动)推荐您的朋友注册就送15元我反佣10元活动到2006年3月24日至3月31日结束,只要您来注册贝宝并获得认证,
    您就会立即收到我反佣的¥10.00的奖金,告诉我你贝宝的ID和注册的信箱,
    我会注入您的贝宝帐户10元。我QQ315557123
    注意要用身份证认证,认证全部免费,身份证有的不会自动认证,如果提示身份证号错误,
    请拍下身份证用电邮传给贝宝公司,1天就可以认证成功。
    https://www.paypal.com/cn/refer/pal=loulixin1983%40yahoo%2ecom%2ecn
      

  11.   

    呵呵,基础代码,到处都有的
    还有一个特别的方法
    适合XP/2003的
    用MS的LegitCheck COM来做,LegitCheck就是MS WinXP/2003的正版验证系统
    其提供的ILegitCheck就有IsAdministrator的函数,呵呵:)