Visual Studio C ++ RegOpenKeyEx () Доступ к реестру запрещен ошибка 64-разрядная версия Windows 7

Я запускаю программу на C ++ (которая отлично работает на 32-разрядной Win XP) в 64-разрядной версии Windows 7 в отладчике в Visual Studio 2010, и мне не удается открыть существующий раздел реестра со следующим кодом:

#define ACCESS  (KEY_WRITE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS)

HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_64KEY, &hKey);

if (dwErrorCode != ERROR_SUCCESS) 
{
// display error message
}

Возвращенный код ошибки: 5 с системным сообщением «Доступ запрещен».

Это сработает, если я запускаю Visual Studio 2010 от имени администратора, но я бы предпочел не делать этого. Кто-нибудь может предложить предложение?

Обновление: я забыл упомянуть, что я здесь портирую устаревший код из Windows XP. Таким образом, у меня нет возможности изменить фундаментальную структуру того, как было написано это программное обеспечение. Поскольку устаревший код использует реестр, это то, что должен делать и перенесенный код.

Кроме того, я бы предпочел не вносить изменения в свой конкретный компьютер, поскольку это означает, что мне придется менять каждый компьютер, на котором я хочу запустить это. Это может вызвать беспорядок, так как затронуто много машин. Например, я не хочу отключать UAC для всей машины.

Дальнейшее обновление: я не нашел решения, которым я доволен. Решили игнорировать код ошибки 5 в целях отладки, и, похоже, на данный момент он работает достаточно хорошо. Я пытаюсь понять, как стандартные приложения, такие как Word, Firefox и т. Д., Похоже, используют реестр для всех видов настроек, но при этом не имеют повышенных прав, и мне не нужно давать им особые разрешения для внесения изменений в реестр?


person Alan Moore    schedule 15.10.2011    source источник
comment
Чего вы пытаетесь достичь? Может есть решение твоей проблемы получше, чем борьба с UAC?   -  person Jörgen Sigvardsson    schedule 16.10.2011
comment
Вы не должны писать туда, если вы не являетесь установщиком или чем-то подобным. Пора узнать о стандартном пользователе.   -  person David Heffernan    schedule 16.10.2011
comment
Я сохраняю и получаю настройки, относящиеся к устройству, в которое встроено это программное обеспечение, - настройки, которые должны быть постоянными. Не уверены, что это позволяет мне стать установщиком?   -  person Alan Moore    schedule 16.10.2011
comment
Обратите внимание на мои обновления вопроса в ответ на комментарии.   -  person Alan Moore    schedule 16.10.2011
comment
Что ж, если вы не можете изменить приложение или запустить его с повышенными правами, система должна предоставить (разрешения или отключение UAC). Добро пожаловать в ОАК!   -  person Jörgen Sigvardsson    schedule 16.10.2011
comment
Очевидно, я немного запутался, спасибо, что помог мне разобраться. Все ли программы, использующие реестр, должны быть повышены или иметь особые разрешения? У меня создалось впечатление, что большинство приложений Win 7, которые я использую изо дня в день, используют реестр для хранения информации, и я ничего не сделал для улучшения этих приложений и не дал им специальных разрешений.   -  person Alan Moore    schedule 16.10.2011


Ответы (3)


Вам нужно запустить процесс в повышенном режиме или отключить UAC. Вы, конечно, можете назначить права доступа к вашему конкретному разделу реестра, который позволяет вам получить доступ.

person Jörgen Sigvardsson    schedule 15.10.2011
comment
Особый доступ не рекомендуется. - person David Heffernan; 16.10.2011
comment
Я бы предпочел не входить и не менять права доступа к определенному разделу реестра на каждой машине, которую я использую. Если под повышенным режимом вы имеете в виду работу от имени администратора, это работает (см. Мой исходный вопрос), но я бы предпочел лучшее решение. По этой же причине не хочу выключать UAC. - person Alan Moore; 16.10.2011
comment
Похоже, вы хотите получить доступ к чему-то, для чего требуется специальное разрешение, но вы не хотите давать разрешение (ни через повышение прав, ни через изменение ACL). С точки зрения безопасности, общесистемные настройки, такие как конфигурация устройства, требуют большей безопасности, поскольку они могут повлиять на любого пользователя в системе. Разрешение неподготовленному пользователю изменять конфигурацию устройства может вызвать серьезные проблемы. - person user995048; 16.10.2011
comment
@ user995048 Я понимаю, о чем вы говорите. Но разве большинство приложений (Word, Outlook, браузеры), работающих в Windows 7, не используют реестр без необходимости повышения каких-либо прав? - person Alan Moore; 16.10.2011
comment
После того, как я много возился с этим, я решил дать ему правильный ответ. Назначив права доступа User Full Control для моего раздела реестра, будь то 64-разрядный или 32-разрядный реестр, моя программа теперь счастлива. - person Alan Moore; 18.10.2011

Хорошо, я нашел ответ на свой вопрос, поэтому отправлю его здесь на случай, если он понадобится кому-то еще для использования в будущем. Эта ветка оказалась полезной, хотя на самом деле она посвящена C #:

http://social.msdn.microsoft.com/Forums/da-DK/netfx64bit/thread/92f962d6-7f5e-4e62-ac0a-b8b0c9f552a3.

По сути, мне нужно было изменить свое разрешение на чтение 32-битного реестра вместо 64-битного:

HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_32KEY, &hKey);

if (dwErrorCode != ERROR_SUCCESS) 
{
// display error message
}

Вуаля, теперь все работает! Всем спасибо за ваши старания.

Обновление: оказалось, что это не сработало на другой моей машине, что привело меня к выводу, что кто-то, должно быть, изменил права доступа к 32-битному реестру на одной из моих машин. Таким образом, по-прежнему необходимо предоставить пользователю права доступа к разделу реестра, с которым вы хотите работать.

person Alan Moore    schedule 16.10.2011

Я столкнулся с такой же проблемой. Я решил использовать следующее:

LPCTSTR subKey = TEXT("Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\App Paths");
LONG openRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_WOW64_32KEY && KEY_ALL_ACCESS, &hKey);
person msc    schedule 02.04.2018