elva

判断当前用户是否为系统管理员

#include <windows.h>
#include <stdio.h>
#include <lm.h>
#pragma hdrstop

#pragma comment( lib, "netapi32.lib" )

// My thanks to Jerry Coffin (jcoffin@taeus.com)
// for this much simpler method.
bool jerry_coffin_method()
{
    bool result;
    DWORD rc;
    wchar_t user_name[256];
    USER_INFO_1 *info;
    DWORD size = sizeof( user_name );

    GetUserNameW( user_name, &size);

    rc = NetUserGetInfo( NULL, user_name, 1, (byte **) &info );
    if ( rc != NERR_Success )
        return false;

    result = info->usri1_priv == USER_PRIV_ADMIN;

    NetApiBufferFree( info );
    return result;
}



bool look_at_token_method()
{
    int found;
    DWORD i, l;
    HANDLE hTok;
    PSID pAdminSid;
    SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;

    byte rawGroupList[4096];
    TOKEN_GROUPS& groupList = *( (TOKEN_GROUPS *) rawGroupList );

    if ( ! OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, FALSE, &hTok ) )
    {
        printf( "Cannot open thread token, trying process token [%lu].n",
            GetLastError() );
        if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hTok ) )
        {
            printf( "Cannot open process token, quitting [%lu].n",
                GetLastError() );
            return 1;
        }
    }

    // normally, I should get the size of the group list first, but ...
    l = sizeof rawGroupList;
    if ( ! GetTokenInformation( hTok, TokenGroups, &groupList, l, &l ) )
    {
        printf( "Cannot get group list from token [%lu].n",
            GetLastError() );
        return 1;
    }

    // here, we cobble up a SID for the Administrators group, to compare to.
    if ( ! AllocateAndInitializeSid( &ntAuth, 2, SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSid ) )
    {
        printf( "Cannot create SID for Administrators [%lu].n",
            GetLastError() );
        return 1;
    }

    // now, loop through groups in token and compare
    found = 0;
    for ( i = 0; i < groupList.GroupCount; ++ i )
    {
        if ( EqualSid( pAdminSid, groupList.Groups[i].Sid ) )
        {
            found = 1;
            break;
        }
    }

    FreeSid( pAdminSid );
    CloseHandle( hTok );
    return !!found;
}

int main()
{
    bool j, l;

    j = jerry_coffin_method();
    l = look_at_token_method();

    printf( "NetUserGetInfo(): The current user is %san Administrator.n",
        j? "": "not " );
    printf( "Process token: The current user is %sa member of the Administrators group.n",
        l? "": "not " );

    return 0;
}

posted on 2007-05-14 00:56 叶子 阅读(700) 评论(0)  编辑 收藏 引用 所属分类: 网络安全


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理