| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 237 人关注过本帖
标题:判断是否以管理员身份权限运行的C++代码源码
只看楼主 加入收藏
wsgsoft
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2019-12-9
收藏
 问题点数:0 回复次数:0 
判断是否以管理员身份权限运行的C++代码源码
本篇文章属于《518抽奖软件开发日志》系列文章的一部分。



我在开发《518抽奖软件》(www.)的时候,有时候需要判断,进程是否以管理员身份权限运行。网上找了一些代码,很多不能用或不全面,现整理代码如下。

程序代码:
BOOL Tfuns::is_userAdmin()

{

    return is_admin(FALSE);

}

BOOL Tfuns::is_runasAdmin()

{

    return is_admin(TRUE);

}



static BOOL is_admin(BOOL CheckTokenForGroupDeny)

{

    WCHAR  *pGroup = NULL;

    HANDLE  hToken = NULL;

    struct group

    {

        DWORD auth_id;

        WCHAR *name;

    };

    struct group groups[] =

    {

        { DOMAIN_ALIAS_RID_USERS, L"User" },

        { DOMAIN_ALIAS_RID_GUESTS, L"Guest" },

        { DOMAIN_ALIAS_RID_POWER_USERS, L"Power" },

        { DOMAIN_ALIAS_RID_ADMINS, L"Admin" }

    };

    if (GetVersion() & 0x80000000) return TRUE;  //Not NT



    if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken) ||

        OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))

    {

        SID_IDENTIFIER_AUTHORITY SystemSidAuthority = { SECURITY_NT_AUTHORITY };

        TOKEN_GROUPS* ptg = NULL;

        BOOL       ValidTokenGroups = FALSE;

        DWORD      cbTokenGroups;

        DWORD      i, j;



        if (CheckTokenForGroupDeny)

            pCheckTokenMembership = (CHECKTOKENMEMBERSHIP)GetProcAddress(GetModuleHandle(L"ADVAPI32"), "CheckTokenMembership");



        if (!CheckTokenForGroupDeny || pCheckTokenMembership == NULL)

        {

            if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &cbTokenGroups) &&

                GetLastError() == ERROR_INSUFFICIENT_BUFFER)

            {

                if ((ptg = (TOKEN_GROUPS*)GlobalAlloc(GPTR, cbTokenGroups)) &&

                    GetTokenInformation(hToken, TokenGroups, ptg, cbTokenGroups, &cbTokenGroups))

                {

                    ValidTokenGroups = TRUE;

                }

            }

        }



        if (ValidTokenGroups || (CheckTokenForGroupDeny && pCheckTokenMembership))

        {

            PSID psid;

            for (i = 0; i < sizeof(groups) / sizeof(struct group); i++)

            {

                if (AllocateAndInitializeSid(&SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,

                    groups[i].auth_id, 0, 0, 0, 0, 0, 0, &psid))

                {

                    BOOL IsMember = FALSE;

                    if (CheckTokenForGroupDeny && pCheckTokenMembership)

                        pCheckTokenMembership(0, psid, &IsMember);

                    else if (ValidTokenGroups)

                    {

                        for (j = 0; j < ptg->GroupCount; j++)

                        {

                            if (EqualSid(ptg->Groups[j].Sid, psid)) IsMember = TRUE;

                        }

                    }

                    if (IsMember) pGroup = groups[i].name;

                    FreeSid(psid);

                }

            }//for groups

        }

        if (ptg) GlobalFree(ptg);

        CloseHandle(hToken);



        if (pGroup && _wcsicmp(pGroup, L"Admin") == 0) return TRUE;

        else return FALSE;

    }

    return FALSE;

}

搜索更多相关主题的帖子: FALSE 代码 return NULL BOOL 
2023-09-26 13:40
快速回复:判断是否以管理员身份权限运行的C++代码源码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.463958 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved