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

标签 c++ windows winapi

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

我引用被质疑的部分:

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(在 WinNT.h 中为 0x00000001L)
  • SE_PRIVILEGE_REMOVED(在 WinNT.h 中为 0x00000004L)
  • SE_PRIVILEGE_USED_FOR_ACCESS(在 WinNT.h 中为 0x80000000L)

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

再一次,如果零意味着禁用所有权限,我对此表示怀疑,因为禁用所有权限可以简单地通过设置 AdjustTokenPrivileges()DisableAllPrivileges 参数来完成。为 TRUE

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

最佳答案

禁用权限和删除权限是有区别的,前者允许您稍后再次启用它。删除权限意味着以后不能重新启用它。

传递零意味着 SE_PRIVILEGE_ENABLED 位未设置,因此该权限被禁用。

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

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

您可以使用 Sysinternals Process Explorer 查看进程 token 中启用的权限.

关于c++ - 关于 MSDN 代码示例, "Enabling and Disabling Privileges",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080927/

相关文章:

c++ - 请需要帮助 C++,使用 bool 等

windows - 如何获取非常不寻常的格式文本文件的必要值?

c++ - 窗口类注册失败

c++ - 如何创建没有透明内容的完全透明窗口?

c++ - 位标志是 std::byte 的预期用途吗?

c++ - 对 std::stack 指针调用删除

arrays - 向 ArrayList 添加一组新值

winapi - malloc 和 HeapAlloc 之间是否有根本区别(除了可移植性)?

c++ - cpp中指针的类型转换

windows - 如何通过 bat 文件关闭、重新启动或注销 Windows?