检查进程用户是否是管理员c ++

时间:2009-06-11 13:44:39

标签: c++ process

我想获取进程的用户名并检查它是否是本地管理员。或直接检查当前处方用户是否为本地管理员

3 个答案:

答案 0 :(得分:3)

使用 GetUserName()获取当前用户名,然后使用服务器名称(本地为NULL)和您刚刚获得的用户名调用NetUserGetInfo()。传递USER_INFO_1结构,然后访问结构中的 usri1_priv 。如果值为 USER_PRIV_ADMIN ,那么您将知道用户名是管理员。

答案 1 :(得分:2)

使用管理员用户和非管理员用户在Windows XP SP3,Windows 7 32位和64位上进行测试。 代码从等效的C#移植并使用ATL窗口安全包装类。

#include <atlbase.h>
#include <atlsecurity.h>

// The function returns true if the user who is running the
// application is a member of the Administrators group,
// which does not necessarily mean the process has admin privileges.
bool IsAdministrator(HRESULT &rHr)
{
    bool bIsAdmin = false;

    try
    {
        // Open the access token of the current process.
        ATL::CAccessToken aToken;
        if (!aToken.GetProcessToken(TOKEN_QUERY))
        {
            throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32,
                ::GetLastError());
        }


        // Query for the access token's group information.
        ATL::CTokenGroups groups;
        if (!aToken.GetGroups(&groups))
        {
            throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32,
                ::GetLastError());
        }

        // Iterate through the access token's groups
        // looking for a match against the builtin admins group.
        ATL::CSid::CSidArray groupSids;
        ATL::CAtlArray<DWORD> groupAttribs;
        groups.GetSidsAndAttributes(&groupSids, &groupAttribs);
        for (UINT i = 0; !bIsAdmin && i < groupSids.GetCount(); ++i)
        {
            bIsAdmin = groupSids.GetAt(i) == ATL::Sids::Admins();
        }
        rHr = S_OK;
    }
    catch (HRESULT hr)
    {
        rHr = hr;
    }

    return bIsAdmin;
}

答案 2 :(得分:0)

假设你在Window OS上有一个shell函数: IsUserAnAdmin

请参阅MSDN article

本文建议滚动您自己的功能,使用 CheckTokenMembership 。甚至还有一个代码示例可以帮助您。