Posted on 2005-07-25 09:11
Raistlin 阅读(427)
评论(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;
}