Не могу прочитать определенные ключи реестра программно - PullRequest
1 голос
/ 06 сентября 2010

У меня есть небольшое приложение, которое считывает значения строки ключа реестра.Он работает хорошо, но по какой-то причине не работает на этом ключе: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId Несмотря на работу с другими значениями HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\

Он также не работает на `HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography \ MachineGuid '

Я работаю как администратор, это фактор?У меня работает W7 64bit, другая машина W7 и Vista работают нормально.Мои единственные предположения касаются некоторых проблем с правами доступа или связаны с тем, что я запускаю 64-битную версию.

Есть идеи?

update: Похоже, что-то связано с моей системойпод управлением Windows 64bit и \Software\Wow6432Node\.Я не знаю, что это за .У меня есть и \Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\, и \Software\Microsoft\Windows NT\CurrentVersion\, но только последний содержит значение ProductId ... по какой-то причине, когда я спрашиваю ключ, Windows, по-видимому, ищет в Wow6432Node

Мы используем wxWidgets, но, возможно, моглипри необходимости использовать некоторый код win32 ... наше приложение является 32-битным, но на целевых ПК могут работать 32- или 64-битные версии Windows

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Это связано с WOW64 . Этот другой вопрос фокусируется на деталях.

0 голосов
/ 11 декабря 2013

Я получил следующий код для работы с 32-битным XP и 64-битным Win 7.Я думаю, что это должно охватывать большинство баз.

// start out trying to read machine guid on 32 bit machine
object value = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", @"MachineGuid", (object) "defaultValue");

if (value != null && value.ToString() != "defaultValue")
{
    return value.ToString();
}

// read machine guid on 64 bit machine
RegistryKey regKeyBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey regKey = regKeyBase.OpenSubKey(@"SOFTWARE\Microsoft\Cryptography", RegistryKeyPermissionCheck.ReadSubTree);
value = regKey.GetValue("MachineGuid", (object) "defaultValue");

regKeyBase.Close();
regKey.Close();

if (value != null && value.ToString() != "defaultValue")
{
    return value.ToString();
}

return string.Empty;
0 голосов
/ 06 сентября 2010

Я только что посмотрел свой реестр, и нет ключа в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProductId или MachineGuid, это на 64-битной Win7

...