Рейтинг:
7
Sergey Alexandrovich Kryukov
Это просто означает, что поиск по ключу не удался: http://msdn.microsoft.com/en-us/library/z9f66s0a.aspx[^].
Причина проста: ключ path
не найти. Используйте Regedit, чтобы проверить это. Я также могу сказать вам, что проблема не связана с отсутствием требуемых привилегий: в таком случае вызов вызовет исключение.
[Правка #1]
Пожалуйста, смотрите мой комментарий ниже.
Вот ваша проблема: вы работаете с x86 архитектура набора инструкций через эмулятор WoW64 на 64-а. Ваш реестр имеет отдельные различные представления для каждой архитектуры, поэтому по умолчанию вы используете это представление Microsoft.Win32.RegistryView.Registry32
. Если вы проверяете путь с помощью Regedit, вы можете увидеть другие данные, потому что вы смотрите на RegistryView.Registry64
.
Таким образом, если вам нужно получить доступ к некоторым данным реестра в одном представлении, вы должны решить, какой из них. Затем, в общем случае, вы должны явно указать представление:
RegistryKey baseKey = RegistryKey.OpenBaseKey(
RegistryHive.LocalMachine,
RegistryView.Registry64);
RegistryKey key = baseKey.OpenSubKey(yourPath, RegistryKeyPermissionCheck.ReadSubTree);
Кроме того, вы можете работать с различными наборами данных для различных представлений/архитектур.
Вы получаете картину?
[Правка #2]
Кроме того, вам может потребоваться иметь разный код для разных целевых архитектур наборов команд. Например, в 32-разрядной системе вам может потребоваться использовать
Default
ключ.
Во-первых, вам нужно выяснить "битность" текущего процесса. Для этого достаточно просто получить размер
IntPtr
:
http://msdn.microsoft.com/en-us/library/system.intptr.size.aspx[
^].
Оставшийся вариант, если это 4 (32-битные), находится там, где он выполняется, на WoW64 или родной платформе. Вот как это делается:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx[
^].
Примените немного логики. Обратите внимание, что вам не нужно точно определять 64-битную архитектуру для вашей цели (x86-64 или Itanium), что было бы сложнее.
Смотреть также:
http://en.wikipedia.org/wiki/WOW64[
^],
http://en.wikipedia.org/wiki/X86[
^],
http://en.wikipedia.org/wiki/X86-64[
^],
http://en.wikipedia.org/wiki/Itanium[
^].
—СА
lalit.mca2006
спасибо Сергею за ответ, но путь правильный, потому что он работает в платформе target 64 или "любом процессоре".
полный путь был :- "SOFTWARE\mycomanayname\Settings\ActiveDirectory\"
Sergey Alexandrovich Kryukov
Откуда вы знаете, что этот путь действительно существует? (Это действительно "mycomanayname"? странное имя...) Вы понимаете, что, чтобы использовать этот призыв, весь путь должен существовать до вызова- А вы его проверяли? И вам нужно открыть улей RegistryView32, так как целевая архитектура x86 работает через WoW64 на каждой из 64-битных архитектур.
—СА
Sergey Alexandrovich Kryukov
Пожалуйста, смотрите обновленный ответ после редактирования. (И спасибо за разъяснения.)
—СА
Sergey Alexandrovich Kryukov
А теперь [правка №2]...
—СА
lalit.mca2006
Спасибо за такую ценную информацию, но Сергей все же я хочу еще одну услугу ,потому что я использую .net framework 3.5, а в 3.5 я не могу найти RegistryKey.Метод OpenBaseKey (....).
Sergey Alexandrovich Kryukov
ОП! Я не обратил внимания, извините. Действительно, этот метод отсутствует в 3.5.
Вероятно, вам следует использовать вместо этого Wow6432Node...
—СА
lalit.mca2006
Да, СА , я пытался, но все равно безуспешно . Поэтому не могли бы вы предложить мне какой-нибудь другой способ сделать то же самое .
Sergey Alexandrovich Kryukov
Давай еще раз. Вы можете скомпилировать свой код для x86, а также x86-64 (x64), не так ли?
Похоже, что эквивалентные пути должны быть:
для x86 код :
"ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\..."
код для х64 :
"Программное обеспечение\Wow6432Node\..."
Может быть, вы пытаетесь сделать все наоборот? Пожалуйста, поймите: вы получаете доступ к x86 (32-разрядному) представлению из x64 (x86-64), а не наоборот.
—СА
lalit.mca2006
Позвольте мне объяснить еще раз :-
у меня есть 64-битная машина windows server -2008, и мой проект-это приложение windows(desktop) в .net framework 3.5 .теперь я хочу прочитать некоторые значения реестра .
это следующие результаты, которые я получаю :-
path =SOFTWARE\xxx\Settings\ActiveDirectory\
RegistryKey regkey = Microsoft.Win32.Registry.Местная машина.OpenSubKey(путь);
В качестве целевой платформы x86 в раздел реестра = значение null
целевые платформы x64 &амп; любой процессор = получаю правильное значение
---------------------------------------------------------
path =SOFTWARE\Wow6432Node\xxx\Settings\ActiveDirectory\
RegistryKey regkey = Microsoft.Win32.Registry.Местная машина.OpenSubKey(путь);
если целевая платформа x86 , regkey = null
если платформа target x64 & any cpu regkey== null
SA , у меня есть ограничение , что я должен использовать только платформу target как x86, поэтому, если я использую x86, то что я должен сделать, чтобы получить значение реестра .
пожалуйста, дайте мне знать, могу ли я объяснить свою фактическую проблему .
Sergey Alexandrovich Kryukov
Именно это я и имел в виду с самого начала. Все выглядит согласованно.
У вас нет ничего на этом ключе в представлении x86, вот и все. В чем проблема? Либо не используйте этот ключ, либо добавьте туда что-то, чтобы сделать его таким же, как в представлении x64. Вы видите эту картину?
Когда вы пытаетесь сравнить этот факт с тем, что вы видите с помощью Regedit, вы путаетесь, но только потому, что это приложение скомпилировано для x64 target. Вот почему поддерживается узел Wow6432Node, чтобы отобразить то, что вы увидите в представлении x86.
Если представления показывают разные результаты, то так оно и есть... просто по-другому. Либо сделайте их такими же, либо уходите с ними. Все последовательно.
—СА
lalit.mca2006
спасибо SA за этот вывод , я получил так много вещей, очищенных о моих результатах вывода .
Но, пожалуйста , последний вопрос заключается в том, что если я построю проект на x86, смогу ли я получить ключевое значение в целевой платформе x86 ?
наконец, мне нужно получить реестр в x86 . :(
Sergey Alexandrovich Kryukov
Я не совсем понимаю. Вы получите доступ ко всему реестру, но только в его представлении x86, Registry32. Этот реестр должен быть согласован с реестром 32-разрядной системы, но код может выполняться на всех 32-разрядных и 64-разрядных платформах одинаково. Это связано с тем, что он будет работать либо на родной платформе, либо на WoW64, которая является 32-разрядной подсистемой в версиях ОС, основанных на архитектурах x86-64 или IE64...
Кстати, вы все-таки примете формальный ответ (зеленая кнопка "принять")?
—СА
lalit.mca2006
Спасибо SA , извините, что я не проверил эту функцию (зеленая кнопка "принять") .
В любом случае, приятно видеть ваш ответ .
Sergey Alexandrovich Kryukov
Вообще никаких проблем...
—СА
lalit.mca2006
я не видел никакой картины СА .
Sergey Alexandrovich Kryukov
И я думаю, что теперь это становится очевидным...
—СА
lalit.mca2006
да, это очевидно, но нужно найти, что как я могу получить значение x64, когда целевая платформа x86 ?
Sergey Alexandrovich Kryukov
В вашем случае значения нет, ключ отсутствует в представлении Registry32. Уходите вместе с ним.
—СА
Рейтинг:
20
Bernhard Hiller
Будьте осторожны с перенаправлением в 64-битных операционных системах. Когда ты это сделаешь
string path = @"Software\Microsoft\Office"
RegKey regkey = Registry.LocalMachine.OpenSubKey(path);
в 64-битной системе с 32-битным приложением ключ, открытый приведенными выше строками, На самом деле является
HKLM\Software\Wow6432Node\Microsoft\Office
- обратите внимание на Wow6432Node в пути! Поэтому будьте осторожны, когда вы смотрите в реестр с помощью regedit.
Sergey Alexandrovich Kryukov
5ed, но ОП остается в замешательстве. Пожалуйста, ознакомьтесь с нашим обсуждением представления x86 в разделе WoW64 в комментариях к моему ответу.
Не могли бы вы объяснить ОП, что картина выглядит последовательной, вы говорите свое мнение о проблеме. OP озабочен идеей "правильных значений", в то время как в представлении x86 значение (точнее, отсутствие какого-то под-ключа) также является "правильным", это то, что действительно есть в реестре...
—СА
Bernhard Hiller
Спасибо. Тем временем ОП принял ваш ответ и, возможно, понял проблему.
Проблемы x86/x64 могут быть очень запутанными. Но есть также две доступные версии regedit: он может открыть его из C:\Windows\SysWOW64 и выяснил, что нет никакого Wow6432Node, и при сравнении с "нормальным" regedit он мог видеть, что он на самом деле показывает Wow6432Node...
Sergey Alexandrovich Kryukov
О, Спасибо за записку.
Хорошая идея, кстати, я не знал о WoW64 regedit, спасибо. С .NET 3.5 (где представления еще не были напрямую поддержаны API) это может быть очень полезно.
—СА