Nano Hash - криптовалюты, майнинг, программирование

Почему реестр записывается в другом месте, чем ожидалось?

Я попытался записать подраздел реестра и соответствующее ему значение в реестр следующим образом:

const string subKey = @"SOFTWARE\Apple\Banana\";
const string regKey = "pip";

var rk = Registry.LocalMachine.OpenSubKey(subKey);
if (rk == null)
    rk = Registry.LocalMachine.CreateSubKey(subKey);

var rv = rk.GetValue(regKey);
if (rv == null)
    rk.SetValue(regKey, "XXX");

return rv.ToString();

Теперь проблема в том, что я, когда я смотрю в локации вручную (через regedit), я не вижу папку SOFTWARE\Apple\Banana в HKLM.

Но когда я снова запускаю приведенный выше код и выполняю отладку, я вижу, что и Registry.LocalMachine.OpenSubKey(subKey), и rk.GetValue(regKey) дают ранее сохраненные значения. Тем не менее, я не вижу значений в данном месте через regedit. Итак, при поиске в реестре я вижу указанные выше ключи и значения в следующих местах:

  1. HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

  2. HKEY_USERS\S-1-5-21-44266131-1313801407-2392705078-1000\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

При обоих значения остаются именно такими, как я сохранил. Итак, я понимаю, что это то место, откуда мое приложение считывает значение, хотя в моем коде я вызываю его из HKLM\SOFTWARE\Apple\Banana\..

  1. Почему это происходит? Это связано с проблемой прав доступа?

  2. Это ожидаемое поведение? В том смысле, что это значение очень важно для меня, поэтому я просто знаю, есть ли какой-то риск, связанный с автоперемещением!

  3. Есть ли правильный способ записи в реестр, чтобы он оставался в своем точном местоположении.

Моя учетная запись администратора, и я использую 32-битную Windows 7.

Изменить: как я узнал, запись реестра хранится в местоположении текущего пользователя, а не в HKLM. И когда я запрашиваю значение reg из другой учетной записи, я не получаю значение. Короче, нет смысла в первую очередь сохранять его в HKLM :(


  • Ответьте на ваш комментарий, но не означает ли это, что будущий пользователь, запрашивающий то же местоположение в hklm, не получит значение, которое находится в местоположении текущего пользователя? Хорошо, я все равно проверю - да, это так. HLM в каталогах реестра и Program Files и ProgramData следует записывать только во время установки. В противном случае туда могут писать только администраторы (и только с повышенными правами, если включен UAC). 08.06.2012
  • @DannyVarod Я не понял твоего первого предложения. В любом случае, когда я тестировал, я узнал, что виртуализация не помогает, если вы хотите получить одно и то же значение реестра для всех пользователей. 08.06.2012
  • В Windows 6+ есть различные места, предназначенные только для хранения данных настройки, и есть другие места, предназначенные для хранения настраиваемых данных или данных, которые изменяются во время выполнения. Во время установки пользователям предоставляется разрешение на запись в места установки (администратором через UAC). Во время выполнения окна запрещают доступ к этим расположениям, если пользователь не является администратором. (Не администраторы не должны влиять на других пользователей.) 08.06.2012

Ответы:


1

Да, это правильное поведение, и это происходит из-за того, что у вас недостаточно прав для прямой записи в куст HKLM. Это называется виртуализацией, и это происходит и с файловой системой, так было в ОС, начиная с Vista.

Вы должны продолжать в том же духе и пытаться также читать с того же ключа HKLM, на который вы записываете, Windows прозрачно перенаправит вас.

Preet любезно предоставил ссылку MSDN, которую вы должны внимательно прочитать.

Обратите внимание, что когда вы получаете доступ к ключу в HKLM, вы также должны включать нужные разрешения, даже если вы работаете от имени администратора (поскольку ключ не открывается автоматически с правами администратора, вы должны запросить его):

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
07.06.2012
  • но не означает ли это, что будущий пользователь, запрашивающий то же местоположение в hklm, не получит значение, которое находится в местоположении текущего пользователя? ладно, все равно попробую.. 08.06.2012
  • У меня такая же проблема, но я пытаюсь сохранить ключ активации в реестре. Я хочу, чтобы ключ был одинаковым для всех пользователей, эта виртуализация не испортит это? 08.02.2013
  • @Alan Да, будет, но если вы пытаетесь написать ключ для всех пользователей, вам нужно указать (требовать) соответствующие права при открытии ключа (что приведет к отображению подсказки UAC, если это необходимо). 08.02.2013
  • @slugster Могу ли я прочитать ключ HKLM без повышения? Я подумывал сказать... да ладно, кого это волнует... они могут ввести ключ для каждого пользователя (тот же ключ) один раз в жизни (виртуализированный), но если они запускают программу от имени администратора изначально во время активации (я предполагаю, что это не не виртуализирован), не сможет ли последующий запуск без прав администратора прочитать ключ? 08.02.2013
  • @Alan Алан, я не пробовал это в последнее время, но IIRC, вы должны иметь возможность читать из HKLM без проблем (хотя у меня были времена, когда мне все еще приходилось явно указывать права на чтение, которые я хочу, это потерпит неудачу, если я не 'т). Обычно виртуализируется запись, а последующие операции чтения из того же места будут считывать виртуализированное значение. 08.02.2013

  • 2
    1. #P1#
      #P2# #P3# #P4#
    2. Да именно так и должно быть.

    3. Либо живите с виртуализацией, если вы хотите записывать в глобально влияющее местоположение, либо используйте более локализованные местоположения, если вы этого не хотите. В любом случае это невидимо для читателя, так что не беспокойтесь об этом.

    07.06.2012
  • @slugster - я думаю, что важно размещать ссылки на цитируемый текст или образцы / блоги других людей. 08.06.2012
  • но не означает ли это, что будущий пользователь, запрашивающий то же местоположение в hklm, не получит значение, которое находится в местоположении текущего пользователя? ладно, все равно попробую.. 08.06.2012
  • У меня такая же проблема, но я пытаюсь сохранить ключ активации в реестре. Я хочу, чтобы ключ был одинаковым для всех пользователей, эта виртуализация не испортит это? 08.02.2013
  • @Alan - см. stackoverflow.com/questions/5409381/ 08.02.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..