BOOL GetUserName(    LPTSTR  lpBuffer, // address of name buffer 
    LPDWORD  nSize  // address of size of name buffer 
   );

解决方案 »

  1.   

    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;