vista下怎样判断用户为系统管理员,xp下的方法用到vista下根本不行.

解决方案 »

  1.   

    恩,这个可以,贴出来普渡众生.
    #include <windows.h> #include <stdio.h>BOOL IsAdmin(void);int main(int argc, char* argv[])
    {
       if (IsAdmin())
           printf("IsAdmin - TRUE");
       else
           printf("IsAdmin - FALSE");   return 0;
    }
    BOOL IsAdmin(void)
    {
        HANDLE                   hAccessToken;
        BYTE                     *InfoBuffer;
        PTOKEN_GROUPS            ptgGroups;
        DWORD                    dwInfoBufferSize;
        PSID                     psidAdministrators;
        SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
        UINT                     i;
        BOOL                     bRet = FALSE;    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken))
           goto cleanup;
        
        InfoBuffer = new BYTE[1024];
        if(!InfoBuffer)
           goto cleanup;    bRet = GetTokenInformation(hAccessToken,
                                   TokenGroups,
                                   InfoBuffer,
                                   1024,
                                   &dwInfoBufferSize);    CloseHandle( hAccessToken );    if(!bRet)
           goto cleanup;    if(!AllocateAndInitializeSid(&siaNtAuthority,
                                     2,
                                     SECURITY_BUILTIN_DOMAIN_RID,
                                     DOMAIN_ALIAS_RID_ADMINS,
                                     0,0,0,0,0,0,
                                     &psidAdministrators))
           goto cleanup;    bRet = FALSE;    ptgGroups = (PTOKEN_GROUPS)InfoBuffer;    for(i=0;i<ptgGroups->GroupCount;i++)
        {
            if(EqualSid(psidAdministrators,ptgGroups->Groups[i].Sid))
            {
                bRet = TRUE;
                break;
            }
        }    FreeSid(psidAdministrators);cleanup:    if (InfoBuffer)
            delete InfoBuffer;    return bRet;
    }