0

キーの下にあるすべての 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);

を返すため、 に対してのみ機能します。プログラムを管理者として実行した場合でも( regedit.exeでは、キーの名前が適切であることがわかります。エラー メッセージが見つからない場合は、いずれにせよ)。HKEY_CURRENT_USERHKEY_LOCAL_MACHINEERROR_ACCESS_DENIEDERROR_ACCESS_DENIED

では、そのキーにアクセスするにはどうすればよいでしょうか? 一部のプログラムがそのキーにアクセスできると確信しています。または、少なくともデフォルト値を取得する方法はありますか (それだけで十分です)。

私のプログラムでは、名前をリストすることしかRegQueryInfoKeyできませんが、それらにアクセスすることはできませんRegOpenKeyEx

4

1 に答える 1

3

管理者であっても、UAC が有効になっている場合、HKLM に KEY_ALL_ACCESS がありません。KEY_ALL_ACCESS が必要な場合は、プログラムを昇格して実行する必要があります。

必要なレベルまで権利を減らします。読み取りだけが必要な場合は、KEY_READ を使用してください。

マニフェストがないとアクセスできる可能性がありますが、このアクセスは仮想化されており、実際のキーにはアクセスできません。

于 2013-11-07T15:41:28.917 に答える