2

MSDN 文章Enabling and Disabling Privileges in C++提供了一个代码示例来展示如何在访问令牌中启用或禁用权限。

我引用了有问题的部分:

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
    tp.Privileges[0].Attributes = 0;


成员的零值是什么意思Attributes

根据TOKEN_PRIVILEGES结构的文档,权限的属性可以是以下值的组合:

  • SE_PRIVILEGE_ENABLED  (在0x00000002LWinNT.h
  • SE_PRIVILEGE_ENABLED_BY_DEFAULT  (在0x00000001LWinNT.h
  • SE_PRIVILEGE_REMOVED  (在0x00000004LWinNT.h
  • SE_PRIVILEGE_USED_FOR_ACCESS  (在0x80000000LWinNT.h

因此,我们看不到任何值为 0 的有效常量。我猜,零等于SE_PRIVILEGE_REMOVED

再一次,如果零意味着禁用所有权限,我对此表示怀疑,因为只需将AdjustTokenPrivileges()DisableAllPrivileges的参数设置为即可禁用所有权限。TRUE

这里的任何人都可以解释零值的真正 作用吗?

4

2 回答 2

4

禁用特权(允许您稍后再次启用它)与从令牌中删除特权之间存在区别。删除权限意味着以后无法重新启用它。

传递零表示SE_PRIVILEGE_ENABLED未设置该位,因此该权限被禁用。

令牌在创建时包含许多特权。在SeChangeNotifyPrivilege本地安全策略/组策略的用户权限分配部分中称为“绕过遍历检查”,默认情况下始终启用,不应禁用(有关详细信息,请参阅KB823659)。因此,该DisableAllPrivileges参数实际上没有用。

用户帐户控制(Windows Vista 和更高版本)获取原始登录令牌,对其进行克隆,并使用该SE_PRIVILEGE_REMOVED标志创建用于启动 shell 的“过滤令牌”。然后将原始令牌隐藏起来,以便“以管理员身份运行”功能可以使用它来启动程序。

您可以使用Sysinternals Process Explorer查看进程令牌中启用的权限。

于 2014-02-19T16:47:24.753 回答
1

If SE_PRIVILEGE_REMOVED等于零,它会被定义为这样。鉴于存在的定义,我建议零值意味着从未启用或随后使用/删除任何特权:存在并且从未存在任何令牌特权。

于 2012-10-26T05:07:58.520 回答