Как записать 32-битный D-Word в реестр Windows на C++

Я пытаюсь отключить Защитника Windows с помощью приложения C32 Win32API. Для этого мне нужно записать D Word в реестр (DisableAntiSpyware = 1). Я всегда делаю это вручную после установки новой Windows. Вот мой код, но он не работает. Может быть, кто-то может сказать мне, почему или что не так с этим. Спасибо!

Хорошо, я немного изменил код, все еще не работает...

        case 1:

            //::MessageBeep(MB_ICONERROR);
            ::MessageBox(hWnd, L"Button was Pressed",L"Button was clicked?",MB_OK);

            LONG
            SetRegValue
            (
            const wchar_t* path
            , const wchar_t *name
            , const BYTE *value

                );
            {
                LONG status;
                HKEY hKey;

                DWORD value = 0x00000001;

                status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"\\SOFTWARE\\Policies\\Microsoft\\Windows Defender", 0, KEY_ALL_ACCESS, &hKey);
                if ((status == ERROR_SUCCESS) && (hKey != NULL))
                {
                    status = RegSetValueEx(hKey, L"test", 0, REG_DWORD, (const BYTE*)&value,sizeof(value));
                    RegCloseKey(hKey);
                }
                return status;

                ::MessageBeep(MB_ICONERROR);
            }
        }
    }
    break;

2 ответа

Решение

Открывая ключ реестра, вы должны запрашивать только те права, которые вам действительно нужны. Так замени KEY_ALL_ACCESS с KEY_SET_VALUE вместо этого, поскольку все, что вы делаете, - это записываете значение. Но даже в этом случае вам может потребоваться запустить приложение с повышенными разрешениями для записи в HKEY_LOCAL_MAHCINE, если вы заранее не предоставите учетной записи пользователя право записи для ключа Защитника Windows.

Кроме того, если ваш код скомпилирован как 32-битный и работает на 64-битной системе, и ему нужно записать в 64-битный реестр, то вы должны включить KEY_WOW64_64KEY в противном случае вы можете быть подвержены Рефлексу Реестра/ Перенаправлению Реестра.

Попробуйте что-то более похожее на это:

case 1:
{
    ::MessageBox(hWnd, L"Button was Pressed", L"Button was clicked?", MB_OK);

    DWORD value = 1;
    DWORD flags = KEY_SET_VALUE;

    #if !defined(_WIN64)
    BOOL bIsWow64Process = FALSE;
    if (IsWow64Process(GetCurrentProcess(), &bIsWow64Process) && bIsWow64Process)
        flags |= KEY_WOW64_64KEY;
    #endif

    HKEY hKey;
    LONG status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"\\SOFTWARE\\Policies\\Microsoft\\Windows Defender", 0, flags, &hKey);
    if ((status == ERROR_SUCCESS) && (hKey != NULL))
    {
        status = RegSetValueEx(hKey, L"DisableAntiSpyware", 0, REG_DWORD, (const BYTE*)&value, sizeof(value));
        RegCloseKey(hKey);
    }

    ::MessageBeep(MB_ICONERROR);
}
break;

Вы не можете написать на любой ключ в HKEY_LOCAL_MACHINE если программа не запущена с повышенными привилегиями, то есть в режиме администратора. Призыв к RegOpenKeyEx или же RegSetValueEx не удастся.

Другие вопросы по тегам