c++ - 枚举权限(本地安全策略)

标签 c++ windows security policy user-accounts

我知道 NT header 中的所有常量都定义为 SE_TAKE_OWNERSHIP_NAME,因此可以使用函数将这些转换为人类可读的形式(获取文件或其他对象的所有权).

我的问题是如何枚举这些名字?对于不同版本的 Windows,并非所有 SE 名称都适用(即特定 NT 系统可能不提供特权)。

虽然 Windows7/2008 确实是最新的并且适用于相同的 header 会列出所有这些 - 如果应用程序在较低的平台上运行,则采用 SE 名称的函数对于给定的名称只会失败操作系统不支持(例如 LsaEnumerateAccountsWithUserRight 会失败)。

但是如何使应用程序 future 兼容,以便于列出 future 版本的 Windows 操作系统的所有权限?

最佳答案

使用 LsaEnumeratePrivileges(在 WDK - inc/api 中的 ntlsa.h 中定义):

NTSTATUS
NTAPI
LsaEnumeratePrivileges(
    __in LSA_HANDLE PolicyHandle,
    __inout PLSA_ENUMERATION_HANDLE EnumerationContext,
    __out PVOID *Buffer,
    __in ULONG PreferedMaximumLength,
    __out PULONG CountReturned
    );

您获得的缓冲区是一个 POLICY_PRIVILEGE_DEFINITION 结构数组:

typedef struct _POLICY_PRIVILEGE_DEFINITION
{
    LSA_UNICODE_STRING Name;
    LUID LocalValue;
} POLICY_PRIVILEGE_DEFINITION, *PPOLICY_PRIVILEGE_DEFINITION;

例如:

#include <ntlsa.h>

NTSTATUS status;
LSA_HANDLE policyHandle;
LSA_ENUMERATION_HANDLE enumerationContext = 0;
PPOLICY_PRIVILEGE_DEFINITION buffer;
ULONG countReturned;
ULONG i;

LsaOpenPolicy(..., &policyHandle);

while (TRUE)
{
    status = LsaEnumeratePrivileges(policyHandle, &enumerationContext, &buffer, 256, &countReturned);

    if (status == STATUS_NO_MORE_ENTRIES)
        break; // no more privileges
    if (!NT_SUCCESS(status))
        break; // error

    for (i = 0; i < countReturned; i++)
    {
        // Privilege definition in buffer[i]
    }

    LsaFreeMemory(buffer);
}

LsaClose(policyHandle);

关于c++ - 枚举权限(本地安全策略),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642945/

相关文章:

c++ - 在虚幻引擎 C++ 中设置计时器

c++ - 简单的代码,看似随机的结果 - 这是由于过时的引用吗?

windows - 安装 win32gui 时出错

android - 如何加密 Assets

security - 是否可以在应用程序级别限制请求域?

php - 测试不安全的结帐页面

c++ - 试图区分不同类型的右值——文字和非文字

c++具有 vector 的不同对象都包含相同的内容

python - 在 Windows 中设置默认的 pylint config.rc 文件

windows - cmd.exe/k (echo %1 & echo %~n1) 放入注册表命令项时未按预期输出