如何判断用户是否是一个管理员
2009-03-29 20:32
441 查看
如何判断用户是否是一个管理员
许多应用程序在允许用户执行某个操作之前,首先要判断这个用户是否是一个管理员,但在执行判断成员关系的过程中可能会出现错误。在Administrators组中判定成员关系的最常见方法就是创建一个适当的SID,并且在用户令牌中检查这个SID。但是,对于严格的令牌来说,这种检查是不够的。另一种常见的方法就是指定名称“Administrators”来查找SID:
但这种方法也不能进行精确的定位,因此不是最佳的方法。最佳方法就是使用CheckTokenMembership()来检查用户在任何组中的成员关系。如果需要修复在这个代码实例中出现的问题,应该将上面的代码写成以下形式:
by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。
许多应用程序在允许用户执行某个操作之前,首先要判断这个用户是否是一个管理员,但在执行判断成员关系的过程中可能会出现错误。在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 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。
相关文章推荐
- 如何判断用户输入的一个整数是否为2的整数幂
- VC++中如何判断当前用户是否具有管理员权限
- 如何判断当前用户是否是系统管理员
- Magento中如何判断一个用户是否已经登陆
- magento -- magento中如何判断一个用户是否已经登陆
- 如何判断用户是否具备管理员权限
- magento -- magento中如何判断一个用户是否已经登陆
- 转一份在 51testing 上的讨论——如何测试一个门户网站是否可以支持10万用户同时在线?
- 提示用户通过键盘输入一个用户名,来判断这个用户是否存在,如果存在就显示一下用户默认的shell
- 如何快速判断一个整数是否可以整除另一个整数的理论分析
- 如何判断一个查询的结果是否为空
- 如何判断一个数是否是质数(C语言)-超详细
- shell中如何判断一个变量是否为空
- sqlite3如何判断一个表是否已经存在于数据库中c++
- 如何判断用户是否访问过某个网址
- js如何判断一个对象{}是否为空对象,没有任何属性
- 如何判断一个类是否支持某属性和方法以及如何判断IOS的版本
- 如何在shell脚本中,判断一个基本命令执行是否成功?
- 腾讯面试题 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- ThinkPHP如何判断一个更新操作是否成功