Запись в HKEY_LOCAL_MACHINE из .Net не виртуализируется в Vista или Windows 7?

У меня проблемы с пониманием виртуализации VirtualStore операций реестра в Vista и / или Windows 7. Я подумал, что попытка записать что-то в корень HKEY_LOCAL_MACHINE при работе от имени стандартного пользователя заставит Windows виртуализировать операцию и написать вместо этого на HKEY_CURRENT_USER / Classes / VirtualStore / MACHINE. Я видел, как несколько старых приложений ведут себя именно так.

Однако при попытке воспроизвести это поведение в C # и .Net4 операция записи в HKLM просто завершается ошибкой с UnauthorizedAccessException. Есть ли способ принудительно виртуализировать?

Чтобы дать некоторый контекст для вопроса: я пытаюсь читать и управлять ключами реестра, изначально созданными другим устаревшим приложением. В Vista или Windows 7 они будут расположены в VirtualStore. Я хотел бы использовать одну и ту же логику доступа к реестру как для WinXP, так и для более поздних версий, и думал, что мои операции с реестром будут виртуализированы точно так же, как операции из устаревшего приложения (и из-за этого будут работать с теми же ключами). Это работает не так, как ожидалось, и единственный известный мне обходной путь - это специально получить доступ к пути VirtualStore, если пользователь работает под Vista или 7 и имеет включенный UAC ... кажется уродливым, хотя, особенно если Microsoft решает изменить поведение виртуализации в будущих версиях Windows.


person Mario    schedule 23.01.2011    source источник


Ответы (1)


В статье MSDN Виртуализация реестра в Windows Vista объясняется, что определенные классы процессов имеют виртуализация отключена:

  • 64-битные процессы
  • Исполняемые файлы, для которых в манифесте указан requiredExecutionLevel
  • и некоторые другие; подробности читайте в статье

Один или оба из первых двух обычно верны для приложения .NET (из-за предоставленного компилятором манифеста по умолчанию). Вам придется удалить манифест (чтобы ваше приложение выглядело как устаревшее приложение), чтобы включить виртуализацию, но это будет плохой идеей (для прямой совместимости с Windows). Вместо этого просто предположите, что ваше приложение не виртуализировано в Vista (и более поздних версиях), и действуйте соответствующим образом.

Кроме того, в статье предупреждается, что «Microsoft намерена удалить эту форму виртуализации из будущих версий операционной системы Windows ... крайне важно, чтобы ваше приложение не зависело от наличия виртуализации в системе». Какой бы код вы ни писали, следует ожидать, что ключ VirtualStore может не существовать в будущей версии Windows.

person Bradley Grainger    schedule 23.01.2011
comment
Спасибо, это объясняет все, что я хотел знать :) ... кроме того, если Microsoft когда-либо решит удалить или изменить эту виртуализацию реестра, то устаревшее приложение, вероятно, все равно не будет работать - поэтому мое приложение больше не будет служить цели так или иначе. - person Mario; 24.01.2011