Я хочу получить все ключи 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
,
Даже в качестве администратора у вас нет KEY_ALL_ACCESS на HKLM, когда UAC включен. Если вы хотите или нуждаетесь в KEY_ALL_ACCESS, вам нужно запустить вашу программу с повышенными правами.
Снизьте свои права до необходимого уровня. Если вы хотите читать, просто используйте KEY_READ!
И позаботьтесь о том, чтобы у вас был встроенный манифест, без манифеста вы могли бы получить доступ, но этот доступ виртуализирован, и вы не получите доступ к реальному ключу.
Других решений пока нет …