Статья была отредактирована и доработана с помощью AI. Текс сделан более структурированным, грамотным.

Проблема, с которой я столкнулся

На любой Windows, где язык системы не английский, whodata в Wazuh просто не включался:

2026/03/22 16:34:50 wazuh-agent: ERROR: (6955): Auditpol command failed, attempt number: 1
2026/03/22 16:34:50 wazuh-agent: ERROR: (6955): Auditpol command failed, attempt number: 2
2026/03/22 16:34:50 wazuh-agent: ERROR: (6955): Auditpol command failed, attempt number: 3
2026/03/22 16:34:50 wazuh-agent: ERROR: (6955): Auditpol command failed, attempt number: 4
2026/03/22 16:34:50 wazuh-agent: ERROR: (6955): Auditpol command failed, attempt number: 5
2026/03/22 16:34:50 wazuh-agent: ERROR: (6955): Auditpol command failed, attempt number: 6
2026/03/22 16:34:50 wazuh-agent: ERROR: (6915): Audit policies could not be auto-configured due to the Windows version. Check if they are correct for whodata mode.
2026/03/22 16:34:50 wazuh-agent: ERROR: (6916): Local audit policies could not be configured.
2026/03/22 16:34:50 wazuh-agent: ERROR: (6710): Failed to start the Whodata engine. Directories/files will be monitored in Realtime mode

Я начал изучать данную ошибку и оказалось, что "Главная" проблема это локализация.
Функция set_policies() в win_whodata.c cделала : auditpol /backup генерирует CSV где подкатегории записаны на языке системы. auditpol /restore в некоторых версиях Windows не умеет читать этот файл обратно если имена не на английском. Я решил пойти по другому пути, а именно auditpol /set /subcategory:{GUID} . GUID — это глобальный уникальный идентификатор жёстко зашитый в Windows, он одинаков на всех локалях. Никакого CSV, никакого парсинга, никакой зависимости от языка.
Я подготовил инструкцию, чтобы каждый мог собрать себе агента.

1. Подготовка окружения (Ubuntu 22.04)

sudo apt-get update && sudo apt-get install -y mingw-w64 gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-tools cmake make git python3 curl wget nsis autoconf automake libtool pkg-config zip unzip

Проверяем компилятор:

i686-w64-mingw32-gcc --version

2. Скачиваем исходник

Я собирал на версии wazuh 4.14.3, актуальной на тот момент.

mkdir -p ~/wazuh-build && cd ~/wazuh-build
wget https://github.com/wazuh/wazuh/archive/refs/tags/v4.14.3.tar.gz -O wazuh-4.14.3.tar.gz
tar -xzf wazuh-4.14.3.tar.gz && cd wazuh-4.14.3

3. Патч 1 — Главный фикс локализации (работает на всех не-English)

vim src/syscheckd/src/whodata/win_whodata.c

Полностью заменяем функцию set_policies() (примерно с 1259 строки) на эту версию:

int set_policies() {
    /* Универсальный патч для любой локали Windows.
     * Вместо CSV с кириллицей/иероглифами используем GUID */
    int result = 0;

    if (system("auditpol /set /subcategory:{0CCE921D-69AE-11D9-BED3-505054503030} /success:enable /failure:enable") != 0) {
        fprintf(stderr, "set_policies: failed File System GUID\n");
        result = -1;
    }
    if (system("auditpol /set /subcategory:{0CCE9223-69AE-11D9-BED3-505054503030} /success:enable /failure:enable") != 0) {
        fprintf(stderr, "set_policies: failed Handle Manipulation GUID\n");
        result = -1;
    }
    return result;
}

4. Патч buffer.c

# Патч buffer.c
sed -i '/dispatch_buffer/,/^}/s/return NULL;/return 0;/' src/client-agent/buffer.c

# Прототип (в 4.14.3 обычно уже норм, но на всякий)
grep -q "fim_check_db_state();" src/syscheckd/include/syscheck.h && \
sed -i 's/void fim_check_db_state();/void fim_check_db_state(int nodes_limit, int nodes_count, fim_state_db* db_state, const char* table_name);/' src/syscheckd/include/syscheck.h

5. Включаем WIN_WHODATA и линковку

python3 << 'EOF'
with open("Makefile", "r") as f:
    lines = f.readlines()

for i, line in enumerate(lines):
    # Патч 1: DEFINES+=-DWIN_WHODATA
    if "PRECOMPILED_OS:=windows" in line:
        lines.insert(i + 1, "                DEFINES+=-DWIN_WHODATA\n")

    # Патч 2: WIN_WHODATA в cmake syscheckd
    elif "cd ${SYSCHECK} && mkdir -p build && cd build && cmake" in line and "WIN_RESOURCE_OBJ" in line:
        lines[i] = line.rstrip().replace(
            ".. && ${MAKE}",
            '-DCMAKE_C_FLAGS="-DWIN_WHODATA -DCLIENT -D_POSIX_C_SOURCE -DWIN32 -DPSAPI_VERSION=1" .. && ${MAKE}'
        ) + "\n"

    # Патч 3: -lwevtapi в линковку
    elif "-lwazuh-syscheckd -l:libfimdb.lib libwazuh.a -o $@" in line and "EVENTCHANNEL" not in line:
        lines[i] = line.replace(
            "-lwazuh-syscheckd -l:libfimdb.lib libwazuh.a -o $@",
            "-lwazuh-syscheckd -l:libfimdb.lib libwazuh.a -lwevtapi -o $@"
        )

with open("Makefile", "w") as f:
    f.writelines(lines)

print("✅ Все три патча Makefile применены")
EOF

6. Сборка

make deps TARGET=winagent          # ~5-10 минут
rm -rf syscheckd/build             # обязательно после патчей Makefile!
make -j$(nproc) TARGET=winagent    # 15-40 минут

Готовый файл будет здесь: src/win32/wazuh-agent.exe

7. Установка на windows

Останавливаем агента, заменяем наш модифецированный wazuh-agent.exe в C:\Program Files (x86)\ossec-agent, стартуем агента. И всё, теперь whodata работает с любой локалью!