NT下判断用户是否有管理员权限

Posted on 2005-07-25 09:11 Raistlin 阅读(407) 评论(0)  编辑 收藏 引用 所属分类: C++

用VC来操纵NT权限的东西真是头大...只想实现判断用户是否为管理员,被RID(relative identifier )搞死了,从头到尾我都没明白它是怎么回事。MSDN含糊其词,网上找的东西不是太高深,就是太表面,要不是黑客大侠们写的用来超越管理员权限的代码,就是大学课堂里面表面的解释。看得头晕脑涨,呜乎哀哉。
一开始只会用LookupAccountName获得用户的SID,GetSidIdentifierAuthority获得SID_IDENTIFIER_AUTHORITY值,再和SECURITY_NT_AUTHORITY比较,相同则认为具备管理员权限,不同则不具备,代码写得战战兢兢。后来去csdn求助,完善代码如下,希望不至于出大乱子..

BOOL CRSysInfo::IsUserAdminPrivilege(const CString & strUserName,BOOL & bAdminPrivilege)

        bAdminPrivilege 
= FALSE;

        PSIDpSid 
= NULL;
        DWORDcbSid 
= 0;
        LPTSTRbufDomain 
= NULL;
        DWORDcbDomain 
= 0;
        SID_NAME_USEtype;
        LookupAccountName(NULL,strUserName,pSid,
&cbSid,bufDomain,&cbDomain,&type);
        
if(cbSid)
        {
                pSid 
= new byte[cbSid];
                bufDomain 
= new TCHAR[cbDomain];
                
if(LookupAccountName(NULL,strUserName,pSid,&cbSid,bufDomain,&cbDomain,&type))
                {
                        PSID_IDENTIFIER_AUTHORITY pAutho 
= GetSidIdentifierAuthority(pSid);
                        DWORD dwErr 
= GetLastError();
                        
if(!dwErr)
                        {
                                SID_IDENTIFIER_AUTHORITY AdminAuth 
= SECURITY_NT_AUTHORITY;
                                bAdminPrivilege 
= !memcmp(pAutho,&AdminAuth,sizeof(SID_IDENTIFIER_AUTHORITY));
                        }
                }
                delete[]pSid;
                delete[]bufDomain;
        }
        
if(bAdminPrivilege)
                returnTRUE;

        DWORD rc;
        USER_INFO_1 
*info;
        rc 
= NetUserGetInfo(NULL,_bstr_t(strUserName),1,(byte**)&info);
        
if(rc == NERR_Success)
        {
                bAdminPrivilege 
= info->usri1_priv == USER_PRIV_ADMIN;
                NetApiBufferFree(info);
        }

        returnrc 
== NERR_Success;
}
只有注册用户登录后才能发表评论。

posts - 49, comments - 14, trackbacks - 0, articles - 0

Copyright © Raistlin