RegOpenKeyEx () возвращает ERROR_ACCESS_DENIED

Я хочу получить все ключи CLSID, которые находятся под HKEY_CLASSES_ROOT\\SOFTWARE\\Classes\\CLSID ключ.

Я знаю, что этот ключ является зеркалом для слияния HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID а также HKEY_CURRENT_USER\\SOFTWARE\\Classes\\CLSID ключи.

Пока могу перечислить все HKEY_CLASSES_ROOT\\SOFTWARE\\Classes\\CLSID (HKEY_LOCAL_MACHINE\\... а также HKEY_CURRENT_USER\\... а также) и получить имена этого ключа в std::wstring[], Но когда я пытаюсь открыть эти ключи:

//CLSID = e.g. L"{CAFEEFAC-0013-0001-0001-ABCDEFFEDCBB}"firstKey = HKEY_LOCAL_MACHINE;
keysPath = L"\\SOFTWARE\\Classes\\CLSID\\"+CLSID;
if(x64System)
regsam = KEY_ALL_ACCESS|KEY_WOW64_64KEY; //on my system
else
regsam = KEY_ALL_ACCESS;

result = RegOpenKeyEx(firstKey, keysPath.c_str(), 0, regsam, &outputKey);

Оно работает только за HKEY_CURRENT_USER, за HKEY_LOCAL_MACHINE это возвращается ERROR_ACCESS_DENIED, Даже когда я запустить мою программу от имени администратораregedit.exe я могу увидеть это имя ключа хорошее, если это не будет сообщение об ошибке не будет найдено, не ERROR_ACCESS_DENIED тем не мение).

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

В моей программе я могу перечислить только их имена с RegQueryInfoKey но не может получить к ним доступ с RegOpenKeyEx,

0

Решение

Даже в качестве администратора у вас нет KEY_ALL_ACCESS на HKLM, когда UAC включен. Если вы хотите или нуждаетесь в KEY_ALL_ACCESS, вам нужно запустить вашу программу с повышенными правами.

Снизьте свои права до необходимого уровня. Если вы хотите читать, просто используйте KEY_READ!

И позаботьтесь о том, чтобы у вас был встроенный манифест, без манифеста вы могли бы получить доступ, но этот доступ виртуализирован, и вы не получите доступ к реальному ключу.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]