2011-07-10 97 views
1

我知道NT頭文件定義了所有常量,如SE_TAKE_OWNERSHIP_NAME,因此有函數可用於將它們轉換爲人類可讀形式(Take ownership of files or other objects)。枚舉權限(本地安全策略)

我的問題是如何枚舉這些名稱?對於不同版本的Windows,並不是所有的SE名稱都適用(即特權可能不適用於特定的NT系統)。

雖然確實Windows7/2008是最新的,適當的頭文件會列出所有這些文件,並且如果應用程序在較低的平臺上運行,那麼採用SE名稱的函數只會因給定名稱失敗if因爲操作系統不支持(如LsaEnumerateAccountsWithUserRight會失敗)。

但是,如何使未來的應用程序兼容,可以方便地列出未來版本的Windows操作系統的所有權限?

+0

通過維護您的代碼,當然。 –

+0

沒有吸引力的回覆。我在詢問應用程序兼容性,而不是代碼兼容性。 – Ajay

回答

1

使用LsaEnumeratePrivileges(在ntlsa.h定義,這是在WDK - INC/API):

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); 
+0

哇!這回答了! – Ajay