Как получить значение локальной политики безопасности и групповой политики компьютера?

Тема в разделе "WASM.WIN32", создана пользователем drem1lin, 4 апр 2025 в 18:20.

Метки:
  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    301
    Привет! Хочу спросить совета, а то совсем запутался.
    Есть несколько политик, например "Аудит входа в систему", такая политика есть и в локальной политике безопасности и в групповой, мне надо получить эффективное значение - т.е. на сколько я понял - есть локальная политика и она может быть переписана групповой. Для групповой есть GetAppliedGpoList из которого можно получить значение групповой политики, если оно устанавливалось, а как получить эффективное? Или надо вычитывать два значения и самому это вычислять? Для системной нашел AuditQuerySystemPolicy.

    И вторая проблема - мне нужна поддержка XP, а обе функции будут Vista+.
    Буду благодарен любым советам
     
  2. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    559
    взять реализацию в вайна/reactOS-а
     
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.026
    Для групповой еще вариант wmi
    Код (Text):
    1. strComputer = "."
    2. Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\rsop\computer")
    3.  
    4. Set colItems = objWMIService.ExecQuery("Select * from RSOP_AuditPolicy")
    5.  
    6. Wscript.Echo "RSOP_AuditPolicy"
    7. For Each objItem in colItems
    8.     Wscript.Echo " Category:" & objItem.Category
    9.     Wscript.Echo " Failure:" & objItem.Failure
    10.     Wscript.Echo " precedence:" & objItem.precedence
    11.     Wscript.Echo " Success:" & objItem.Success
    12.     Wscript.Echo " ErrorCode:" & objItem.ErrorCode
    13.     Wscript.Echo " Status:" & objItem.Status
    14.     Wscript.Echo " creationTime:" & objItem.creationTime
    15.     Wscript.Echo " GPOID:" & objItem.GPOID
    16.     Wscript.Echo " id:" & objItem.id
    17.     Wscript.Echo " name:" & objItem.name
    18.     Wscript.Echo " SOMID:" & objItem.SOMID
    19.     Wscript.Echo
    20. Next
    Также можно парсить выхлопы auditpol.exe и gpresult.exe. Может что-то из этого в ХР есть.
     
  4. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    351
    Код (C++):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include <lm.h>
    4. #include <ntsecapi.h>
    5. #include <sddl.h>
    6. #include <string>
    7. #include <vector>
    8.  
    9. #pragma comment(lib, "netapi32.lib")
    10. #pragma comment(lib, "advapi32.lib")
    11.  
    12. // Добавляем определения констант, которые отсутствуют
    13. #ifndef STATUS_SUCCESS
    14. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
    15. #endif
    16.  
    17. #ifndef POLICY_AUDIT_SUCCESS
    18. #define POLICY_AUDIT_SUCCESS 1
    19. #endif
    20.  
    21. #ifndef POLICY_AUDIT_FAILURE
    22. #define POLICY_AUDIT_FAILURE 2
    23. #endif
    24.  
    25. // Структура для хранения информации о политике аудита
    26. struct AuditPolicyInfo {
    27.     std::wstring policyName;
    28.     DWORD localValue;
    29.     DWORD domainValue;
    30.     DWORD effectiveValue;
    31. };
    32.  
    33. // Функция для получения локальных политик аудита (работает в XP)
    34. BOOL GetLocalAuditPolicy(std::vector<AuditPolicyInfo>& policies) {
    35.     LSA_HANDLE policyHandle = NULL;
    36.     LSA_OBJECT_ATTRIBUTES objectAttributes;
    37.     POLICY_AUDIT_EVENTS_INFO* pAuditEventsInfo = NULL;
    38.     NTSTATUS status;
    39.     BOOL result = FALSE;
    40.  
    41.     // Инициализация атрибутов объекта LSA
    42.     ZeroMemory(&objectAttributes, sizeof(objectAttributes));
    43.  
    44.     // Открытие локальной политики
    45.     status = LsaOpenPolicy(
    46.         NULL,
    47.         &objectAttributes,
    48.         POLICY_VIEW_AUDIT_INFORMATION,
    49.         &policyHandle
    50.     );
    51.  
    52.     if (status != STATUS_SUCCESS) {
    53.         printf("LsaOpenPolicy failed: 0x%08X\n", LsaNtStatusToWinError(status));
    54.         return FALSE;
    55.     }
    56.  
    57.     // Получение информации о политиках аудита
    58.     status = LsaQueryInformationPolicy(
    59.         policyHandle,
    60.         PolicyAuditEventsInformation,
    61.         (PVOID*)&pAuditEventsInfo
    62.     );
    63.  
    64.     if (status == STATUS_SUCCESS && pAuditEventsInfo != NULL) {
    65.         // Заполнение структуры данными
    66.         if (pAuditEventsInfo->AuditingMode) {
    67.             // Определение имен политик аудита
    68.             const wchar_t* auditEventNames[] = {
    69.                 L"Аудит событий входа в систему",
    70.                 L"Аудит управления учетными записями",
    71.                 L"Аудит доступа к службе каталогов",
    72.                 L"Аудит входа в систему",
    73.                 L"Аудит доступа к объектам",
    74.                 L"Аудит изменения политики",
    75.                 L"Аудит использования привилегий",
    76.                 L"Аудит отслеживания процессов",
    77.                 L"Аудит системных событий"
    78.             };
    79.  
    80.             // Заполнение вектора политик
    81.             for (DWORD i = 0; i < pAuditEventsInfo->MaximumAuditEventCount; i++) {
    82.                 AuditPolicyInfo policy;
    83.                 if (i < _countof(auditEventNames)) {
    84.                     policy.policyName = auditEventNames[i];
    85.                 }
    86.                 else {
    87.                     wchar_t buffer[64];
    88.                     swprintf_s(buffer, L"Политика аудита %d", i);
    89.                     policy.policyName = buffer;
    90.                 }
    91.  
    92.                 policy.localValue = pAuditEventsInfo->EventAuditingOptions[i];
    93.                 policy.domainValue = 0; // Будет заполнено позже
    94.                 policy.effectiveValue = policy.localValue; // Временно
    95.  
    96.                 policies.push_back(policy);
    97.             }
    98.  
    99.             result = TRUE;
    100.         }
    101.  
    102.         // Освобождение памяти
    103.         LsaFreeMemory(pAuditEventsInfo);
    104.     }
    105.     else {
    106.         printf("LsaQueryInformationPolicy failed: 0x%08X\n", LsaNtStatusToWinError(status));
    107.     }
    108.  
    109.     // Закрытие дескриптора политики
    110.     LsaClose(policyHandle);
    111.  
    112.     return result;
    113. }
    114.  
    115. // Функция для получения доменных политик (упрощенная версия для XP)
    116. BOOL GetDomainAuditPolicy(std::vector<AuditPolicyInfo>& policies) {
    117.     // В Windows XP нет прямого API для получения примененных GPO
    118.     // Можно использовать NetLocalGroupGetInfo для проверки членства в домене
    119.  
    120.     LPWSTR domainName = NULL;
    121.     NETSETUP_JOIN_STATUS joinStatus;
    122.     NET_API_STATUS status;
    123.  
    124.     // Проверка, является ли компьютер членом домена
    125.     status = NetGetJoinInformation(NULL, &domainName, &joinStatus);
    126.  
    127.     if (status == NERR_Success) {
    128.         if (joinStatus == NetSetupDomainName) {
    129.             // Компьютер в домене, но в XP нет простого способа получить примененные GPO
    130.             // Здесь можно использовать WMI или другие методы
    131.             printf("Компьютер является членом домена: %S\n", domainName);
    132.  
    133.             // Для демонстрации просто устанавливаем доменные значения
    134.             // В реальном коде здесь нужно использовать WMI или другие методы
    135.             for (auto& policy : policies) {
    136.                 // Предположим, что доменная политика включает аудит успехов и отказов
    137.                 policy.domainValue = POLICY_AUDIT_SUCCESS | POLICY_AUDIT_FAILURE;
    138.  
    139.                 // Вычисление эффективного значения (доменная политика имеет приоритет)
    140.                 policy.effectiveValue = policy.domainValue;
    141.             }
    142.         }
    143.         else {
    144.             printf("Компьютер не является членом домена\n");
    145.             // Если компьютер не в домене, эффективная политика = локальная
    146.             for (auto& policy : policies) {
    147.                 policy.effectiveValue = policy.localValue;
    148.             }
    149.         }
    150.  
    151.         NetApiBufferFree(domainName);
    152.         return TRUE;
    153.     }
    154.     else {
    155.         printf("NetGetJoinInformation failed: %d\n", status);
    156.         return FALSE;
    157.     }
    158. }
    159.  
    160. // Функция для отображения значения политики аудита
    161. void PrintAuditPolicyValue(DWORD value) {
    162.     if (value == 0) {
    163.         printf("Нет аудита");
    164.     }
    165.     else {
    166.         if (value & POLICY_AUDIT_SUCCESS) {
    167.             printf("Успех");
    168.         }
    169.  
    170.         if ((value & POLICY_AUDIT_SUCCESS) && (value & POLICY_AUDIT_FAILURE)) {
    171.             printf(" и ");
    172.         }
    173.  
    174.         if (value & POLICY_AUDIT_FAILURE) {
    175.             printf("Отказ");
    176.         }
    177.     }
    178. }
    179.  
    180. // Основная функция для получения эффективных политик аудита
    181. BOOL GetEffectiveAuditPolicies() {
    182.     std::vector<AuditPolicyInfo> policies;
    183.  
    184.     // Получение локальных политик
    185.     if (!GetLocalAuditPolicy(policies)) {
    186.         printf("Не удалось получить локальные политики аудита\n");
    187.         return FALSE;
    188.     }
    189.  
    190.     // Получение доменных политик и вычисление эффективных значений
    191.     if (!GetDomainAuditPolicy(policies)) {
    192.         printf("Не удалось получить доменные политики аудита\n");
    193.         // Продолжаем с локальными политиками
    194.     }
    195.  
    196.     // Вывод результатов
    197.     printf("\nЭффективные политики аудита:\n");
    198.     printf("-----------------------------\n");
    199.  
    200.     for (const auto& policy : policies) {
    201.         printf("%S:\n", policy.policyName.c_str());
    202.  
    203.         printf("  Локальная политика: ");
    204.         PrintAuditPolicyValue(policy.localValue);
    205.         printf("\n");
    206.  
    207.         printf("  Доменная политика: ");
    208.         PrintAuditPolicyValue(policy.domainValue);
    209.         printf("\n");
    210.  
    211.         printf("  Эффективная политика: ");
    212.         PrintAuditPolicyValue(policy.effectiveValue);
    213.         printf("\n\n");
    214.     }
    215.  
    216.     return TRUE;
    217. }
    218.  
    219. int main() {
    220.     // Установка кодировки консоли для корректного отображения кириллицы
    221.     SetConsoleOutputCP(1251);
    222.     SetConsoleCP(1251);
    223.  
    224.     printf("Получение эффективных политик аудита...\n");
    225.  
    226.     if (!GetEffectiveAuditPolicies()) {
    227.         printf("Ошибка при получении политик аудита\n");
    228.         return 1;
    229.     }
    230.  
    231.     return 0;
    232. }
     
    alex_dz нравится это.