9

Я попытался написать раздел реестра и его соответствующее значение в реестре, как это:Почему реестр написан в другом месте, чем ожидалось?

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(); 

Теперь проблема заключается в том, что я, когда я смотрю в месте вручную (через смерзаться) Я не могу увидеть папку 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 :(

+0

Ответ на ваш комментарий «но не означает ли это, что будущий пользователь, запрашивающий одно и то же местоположение в hklm, не получит значение, которое находится в текущем местоположении пользователей? Хорошо, я все равно его протещу». HLM в файлах реестра и программных файлов и ProgramData должны записываться только во время установки. Только администраторы могут писать там иначе (и только с возвышением, если UAC включен). –

+0

@ DannyVarod Я не получил твое первое предложение. Во всяком случае, когда я тестировал, я пришел к выводу, что виртуализация не помогает, если вы хотите получить одинаковое значение реестра для всех пользователей. – nawfal

+0

В Windows 6+ есть разные местоположения, предназначенные только для хранения данных установки, и есть другие местоположения, которые предназначенный для хранения настраиваемых данных или данных, которые изменяются во время выполнения. Во время настройки пользователям предоставляется разрешение на запись в места установки (через admin через UAC). Во время выполнения окна предотвращает доступ к этим местоположениям, если пользователь не является администратором. (Не администраторы не должны влиять на других пользователей.) –

ответ

5

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

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

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

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

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl); 
+0

, но разве это не означает, что будущий пользователь запрашивает такое же место в hklm не получит значение, которое находится в текущем местоположении пользователей? Хорошо, я все равно проверю его. – nawfal

+0

за дополнительную подсказку – nawfal

+0

У меня такая же проблема, но я пытаюсь сохранить ключ активации в реестре. Я хочу, чтобы ключ был одинаковым для всех пользователей, будет ли это виртуализация? – Alan

4
  1. This is Registry Virtualization (msdn)

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

    Обзор виртуализации

    До Windows Vista приложения были , обычно выполняемые администраторами. В результате приложения могли получить доступ к системным файлам и разделам реестра. Если эти приложения выполнялись стандартным пользователем, они потерпели бы неудачу из-за недостаточных прав доступа .Windows Vista и более поздние версии Windows улучшают совместимость приложений для этих приложений автоматически , перенаправляя эти операции. Например, операции реестра с глобальным хранилищем (HKEY_LOCAL_MACHINE \ Software) перенаправляются на для каждого пользователя в профиле пользователя, известном как виртуальное хранилище (HKEY_USERS \ _Classes \ VirtualStore \ Machine \ Software).

  2. Да, это точно так, как должно быть.

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

+0

+1, вы включили ссылку :) – slugster

+0

@slugster - Я думаю, что очень важно поместить ссылки на цитируемый текст или образцы других людей/блоги. –

+0

, но не означает ли это, что будущий пользователь, запрашивающий одно и то же местоположение в hklm, не получит значение, которое находится в текущем местоположении пользователей? Хорошо, я все равно проведу его. – nawfal