sofr
sofr

Reputation: 5607

Check if process user is an administrator c++

I want to get the process's user name and check if it is a local administrator . Or check directly if the current procees user is a local administrator

Upvotes: 1

Views: 13465

Answers (3)

dexblack
dexblack

Reputation: 551

Tested on Windows XP SP3, Windows 7 32 bit and 64 bit with admin user and non-admin user. Code ported from equivalent C# and uses ATL windows security wrapper classes.

#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;
}

Upvotes: 2

ZZZzzz
ZZZzzz

Reputation: 85

Get the current username with GetUserName(), then call NetUserGetInfo() with the server name (NULL for local) and username you just got. Pass it a USER_INFO_1 structure, and then access usri1_priv in the structure. If the value is USER_PRIV_ADMIN, then you'll know that the username is an admin.

Upvotes: 3

MrBry
MrBry

Reputation: 392

Presuming you're on a Window OS there's a shell function: IsUserAnAdmin

See MSDN article

This article does suggest rolling your own function though, use CheckTokenMembership. There is even a code example to help you along.

Upvotes: 0

Related Questions