我知道 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/