C++ 关于MSDN代码示例,请参见;启用和禁用特权”;
MSDN文章提供了一个代码示例,演示如何在访问令牌中启用或禁用权限 我引述质询中的部分:C++ 关于MSDN代码示例,请参见;启用和禁用特权”;,c++,windows,winapi,C++,Windows,Winapi,MSDN文章提供了一个代码示例,演示如何在访问令牌中启用或禁用权限 我引述质询中的部分: tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; if (bEnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; 属性成员的零值是什么意思 根据结构文档,权限的属性可以是以下
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
属性
成员的零值是什么意思
根据结构文档,权限的属性可以是以下值的组合:
(在SE\u特权已启用
)WinNT.h中为0x00000002L
- 默认情况下,
SE\u特权已启用(在
)WinNT.h中为0x00000001L
(在SE\u特权\u已删除
)WinNT.h中为0x00000004L
(在SE\u特权用于访问
)WinNT.h中为0x80000000L
SE\u PRIVILEGE\u REMOVED
再一次,如果零意味着禁用所有特权,我对此表示怀疑,因为禁用所有特权只需将的DisableAllPrivileges
参数设置为TRUE
这里的任何人都可以解释零值真正的作用是什么?
如果删除的SE_PRIVILEGE_
等同于零,它将被定义为零。根据那里的定义,我建议零值意味着从未启用或随后使用/删除任何特权:存在并且从未有过任何令牌特权。禁用特权(允许您稍后再次启用)与从令牌中删除特权之间有区别。删除特权意味着以后无法重新启用它
通过零表示未设置SE_PRIVILEGE_ENABLED
位,因此该特权被禁用
令牌在创建时包含许多特权。默认情况下,本地安全策略/组策略的“用户权限分配”部分中称为“绕过遍历检查”的sechangenifyprivilege
,始终处于启用状态,不应被禁用(有关详细信息,请参阅)。因此,DisableAllPrivileges
参数实际上并不有用
用户帐户控制(Windows Vista及更高版本)获取原始登录令牌,克隆它,并使用SE_PRIVILEGE_REMOVED
标志创建用于启动shell的“筛选令牌”。然后隐藏原始令牌,以便“以管理员身份运行”功能可以使用它启动程序
您可以使用查看流程令牌中启用的权限。0表示“禁用”,而不是“删除”。谢谢:-)