Перечисление привилегий (локальная политика безопасности) - PullRequest
1 голос
/ 10 июля 2011

Мне известно, что заголовок NT имеет все константы, определенные как SE_TAKE_OWNERSHIP_NAME, и поэтому есть функции, доступные для преобразования их в удобочитаемую форму (Take ownership of files or other objects).

Мой вопрос заключается в том, как перечислить этиимена?В разных версиях Windows не все SE-имена будут применимы (то есть привилегии могут быть недоступны в конкретной системе NT).

Хотя это правда, что Windows7 / 2008 является самым последним и подходящим заголовком для того же самого, перечислил бы их все - и если приложение работает на более низкой платформе, функция, принимающая SE-имена, просто потерпит неудачу для заданногоимя, если данная ОС не поддерживает (например, LsaEnumerateAccountsWithUserRight потерпит неудачу).

Но как сделать приложение совместимым в будущем, что может упростить перечисление всех привилегий для будущих версий ОС Windows?

1 Ответ

2 голосов
/ 11 июля 2011

Используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...