关于 MSDN 代码示例,"Enabling and Disabling Privileges"

About the MSDN code example, "Enabling and Disabling Privileges"

本文关键字:Enabling and Disabling Privileges MSDN 代码 关于      更新时间:2023-10-16

msdn文章,在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 (在 WinNT.h中是 0x00000002l
  • SE_PRIVILEGE_ENABLED_BY_DEFAULT ( 0x00000001l WinNT.h中)
  • SE_PRIVILEGE_REMOVED ( 0x00000004l WinNT.h中)
  • SE_PRIVILEGE_USED_FOR_ACCESS (在 WinNT.h中是 0x80000000l

因此,我们看不到任何有效常数,值为零。我想,零等于 SE_PRIVILEGE_REMOVED

再次,如果零意味着禁用所有特权,我怀疑它是因为可以通过将ADACKTOKENPRIVIEGES()的DisableAllPrivileges参数设置为TRUE

这里有人可以解释零值真的是什么?

禁用的特权之间存在区别,这使您可以稍后再启用它,并且 emoving 从代币中获得特权。删除特权意味着以后再重新启用。

通过零表示未设置SE_PRIVILEGE_ENABLED位,因此禁用特权。

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

用户帐户控制(Windows Vista及以后)取下原始登录令牌,克隆它,并使用SE_PRIVILEGE_REMOVED标志来创建用于启动Shell的"过滤的令牌"。然后隐藏原始令牌,以便"作为管理员"功能可以使用它来启动程序。

您可以使用Sysinternals Process Explorer看到在该过程中启用的特权。

If SE_PRIVILEGE_REMOVED等于零,它将被定义。鉴于那里的定义,我建议零值意味着从未启用过特权,或者随后使用/删除:有,从来没有任何令牌特权。