您的位置:首页 > 其它

如何判断用户是否是一个管理员

2009-03-29 20:32 441 查看
如何判断用户是否是一个管理员

许多应用程序在允许用户执行某个操作之前,首先要判断这个用户是否是一个管理员,但在执行判断成员关系的过程中可能会出现错误。在Administrators组中判定成员关系的最常见方法就是创建一个适当的SID,并且在用户令牌中检查这个SID。但是,对于严格的令牌来说,这种检查是不够的。另一种常见的方法就是指定名称“Administrators”来查找SID:

//
//See if this user is an Administrator.
//
BOOL  IsMember = FALSE;
TCHAR SidBuffer[128], RefDom[128];
ULONG AdminSidSize = 128 * sizeof(TCHAR);
ULONG RefDomSize = 128 * sizeof(TCHAR);
ULONG Size = 0;
NTSTATUS Status;
PSID AdminSid =(PSID)SidBuffer;
PSID_NAME_USE NameUse;
if(LookupAccountName(NULL, TEXT("Administrator"), &AdminSid,
&AdminSidSize, &RefDom,&RefDomSize, &NameUse))
{
if(!GetTokenInformation(Token, TokenGroups, NULL, 0, &Size))
{
Groups =RtlAllocateHeap(RtlProcessHeap(), 0, Size);
if(Groups)
{
if(GetTokenInformation(Token, TokenGroups, Groups, Size , &Size))
{
for(i =0;i <Groups->GroupCount;i++)
{
if(RtlEqualSid(AdminSid, Groups->Groups[i].Sid)
{
IsAdmin = TRUE;
break;
}
}
}
RtlFreeHeap(RtlProcessHeap(), 0, Groups);
}
}
}


但这种方法也不能进行精确的定位,因此不是最佳的方法。最佳方法就是使用CheckTokenMembership()来检查用户在任何组中的成员关系。如果需要修复在这个代码实例中出现的问题,应该将上面的代码写成以下形式:

BOOL IsMember;
PSID AdminSid;
PSID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
if(AllocateAndInitializeSid(&NtAuthority, 2,
SECURITYBUILTINDOMAINRID, DOMAINALIASRIDADMINS,
0, 0, 0, 0, 0, 0, &AdminSid ) )
{
if (!CheckTokenMembership(Token, AdminSid, &IsMember ) )
{
IsMember =FALSE;
}
GlobalFree(AdminSid);
}


by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: