2011-07-10 4 views
1

Je suis conscient que l'en-tête NT a toutes les constantes définies comme SE_TAKE_OWNERSHIP_NAME, et donc il existe des fonctions disponibles pour convertir ces en forme lisible par l'homme (Take ownership of files or other objects).Énumération des privilèges (stratégie de sécurité locale)

Ma question est de savoir comment énumérer ces noms? Avec différentes versions de Windows, tous les noms SE ne sont pas applicables (c'est-à-dire que les privilèges peuvent ne pas être disponibles sur un système NT particulier). S'il est vrai que Windows7/2008 est l'en-tête le plus récent et le plus approprié, tous les répertoires sont listés. Si l'application fonctionne sur une plate-forme inférieure, la fonction qui prend les noms SE échoue simplement pour le nom étant donné que OS ne supporte pas (comme LsaEnumerateAccountsWithUserRight échouerait).

Mais comment rendre l'application compatible à l'avenir qui peut faciliter la liste de tous les privilèges pour les futures versions de Windows OS?

+0

En conservant votre code, bien sûr. –

+0

Réponse non attrayante. Je pose des questions sur la compatibilité des applications, pas sur la compatibilité du code. – Ajay

Répondre

1

utilisation LsaEnumeratePrivileges (défini dans ntlsa.h, qui est dans le WDK - inc/api):

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

Le tampon que vous obtenez est un réseau de structures de POLICY_PRIVILEGE_DEFINITION:

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

Par exemple:

#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

Wow! Cela répond! – Ajay

Questions connexes