Программно разрешить запись для ключа реестра - PullRequest
4 голосов
/ 13 марта 2010

Мне нужно программно изменить дескрипторы доступа для известного ключа реестра во время установки продукта. Я хочу, чтобы это работало:

  1. Программа установки работает в административном режиме.
  2. Ключ реестра создан.
  3. Функция (та, которая мне нужна) запрашивает ACL из ключа.
  4. Если эта функция обнаружит, что группа «Пользователи» уже имеет доступ на запись, ничего не следует делать.
  5. Если нет, следует добавить новое разрешение, разрешающее доступ для записи в группу «Пользователи».
  6. Разрешения сохраняются для ключа реестра.

Этот вопрос похож на Установка разрешений на запись ключа реестра с использованием .NET , однако мне нужна реализация C ++ / Win32.

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 14 марта 2010

Для получения и установки ACL ключа вам необходимо использовать RegGetKeySecurity и RegSetKeySecurity. Затем вам нужно перебрать ACE, изучая все, которые относятся к SID группы «Пользователи». Затем вы либо измените / удалите существующий и / или добавите новый. Имейте в виду, что работа с ACL в старых Win32 C - это боль.

0 голосов
/ 18 апреля 2019

Наименьший код для предоставления доступа состоит из 3 вызовов API. Он предоставляет полный доступ к данному hkey всем аутентифицированным пользователям и администраторам.

Этот фрагмент не содержит надлежащей обработки ошибок и отчетов. Не копируйте / вставляйте его в производственный код.

    PSECURITY_DESCRIPTOR sd = nullptr;
    ULONG sd_size = 0;
    TCHAR* rights = TEXT( "D:" )                // Discretionary ACL
                  TEXT( "(A;OICI;GA;;;AU)" )    // Allow full control to all authenticated users
                  TEXT( "(A;OICI;GA;;;BA)" );   // Allow full control to administrators

    ConvertStringSecurityDescriptorToSecurityDescriptor( rights, SDDL_REVISION_1, &sd, &sd_size );
    RegSetKeySecurity( hkey, DACL_SECURITY_INFORMATION, sd );
    LocalFree( sd );

Определение наличия у «Пользователей» доступа на запись к ключу может оказаться более сложным, чем ожидалось. В итоге я записал тестовое значение в реестр и проверил результат этой записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...