Запись в HKEY_LOCAL_MACHINE из .Net не виртуализируется в Vista или Windows 7? - PullRequest
6 голосов
/ 24 января 2011

У меня проблемы с пониманием виртуализации операций реестра в 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.

1 Ответ

3 голосов
/ 24 января 2011

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

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

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

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

...