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

我知道,NT SE_TAKE_OWNERSHIP_NAME一样定义了所有的常量,所以可以使用函数将这些常量转换为可读的forms( Take ownership of files or other objects )。

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

虽然Windows7 / 2008是最新的,适当的头文件列出所有这些都是事实 – 如果应用程序运行在较低的平台上,如果给定的名称,支持(如LsaEnumerateAccountsWithUserRight将失败)。

但是如何使未来的应用程序兼容,可以方便地列出未来版本的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);