Невозможно записать в реестр, когда Windows UAC установлен, чтобы всегда уведомлять - PullRequest
1 голос
/ 16 мая 2011

У меня есть приложение на C ++, в котором мы записываем настройки в реестр (в разделе HKEY_CURRENT_USER & HKEY_LOCAL_MACHINE для моего приложения). Когда для контроля доступа пользователя windows установлено значение Always Notify, метод RegCreateKeyEx возвращает отказ в доступе и не пишет в HKEY_LOCAL_MACHINE но он успешно записывает в реестр HKEY_CURRENT_USER. Я использую этот метод для записи:

lRet = RegCreateKeyEx( m_hSWRootKey, LPCTSTR(strKey), 
0, _T(""), m_dwCreationFlag, KEY_WRITE | KEY_READ, 
NULL, &hKey, &Disposition );

Этот метод отлично работает, когда для UAC установлено значение Никогда не уведомлять.

По какой причине он не пишет в HKEY_LOCAL_MACHINE? Как я могу переопределить настройку Windows UAC, чтобы иметь возможность писать, когда для нее установлено значение Всегда уведомлять?

Пожалуйста, предложите.

Ответы [ 2 ]

4 голосов
/ 16 мая 2011

Вы не можете писать на HKEY_LOCAL_MACHINE, если у вас нет прав администратора. Это всегда было верно для версий Windows, основанных на NT. Что изменилось с UAC, так это то, что пользователи-администраторы по умолчанию работают с токеном стандартного пользователя и повышают его только для получения прав администратора для операций, которым требуются повышенные права.

У вас есть два варианта:

  1. Найдите способ достичь своих целей, не обращаясь к HKEY_LOCAL_MACHINE.
  2. Требуется, чтобы пользователь получил права администратора для частей приложения, которые записывают в HKEY_LOCAL_MACHINE.

Из этих вариантов первый предпочтительнее.

0 голосов
/ 16 мая 2011

Если вы выберете путь, разрешающий запуск приложения только от имени администратора, вы можете установить манифест в Visual Studio в:

Проект >> Свойства >> Свойства конфигурации >> Компоновщик >> МанифестФайл >> Уровень выполнения UAC.

В идеале вы найдете способ, не требующий изменения HKEY_LOCAL_MACHINE

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