C++ 关于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; 属性成员的零值是什么意思 根据结构文档,权限的属性可以是以下

MSDN文章提供了一个代码示例,演示如何在访问令牌中启用或禁用权限

我引述质询中的部分:

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表示“禁用”,而不是“删除”。谢谢:-)