Написание в HKEY_LOCAL_MACHINE из .NET не виртуализируется в Vista или Windows 7?
-
23-10-2019 - |
Вопрос
У меня возникают проблемы с пониманием виртуализации виртуальных операций реестра в Vista и/или Windows 7. Я подумал, что пытался написать что -то в Hkey_local_machine root во время работы в качестве стандартного пользователя предложит Windows виртуализировать операцию и записать Hkey_current_user/classes/virtualstore/machine вместо. Я видел, как несколько старых приложений ведут себя точно так.
Однако при попытке воспроизвести это поведение в C# и .NET4, операция записи в HKLM просто терпит неудачу с UnaultorizedAccessException вместо. Есть ли способ заставить виртуализацию?
Чтобы дать какой -то контекст вопросу: я пытаюсь читать и манипулировать ключами реестра, первоначально созданных другим приложением Legacy. В Vista или Windows 7 они будут расположены в VirtualStore. Я хотел бы использовать одну и ту же логику доступа реестра как для Winxp, так и для выше, и думал, что мои операции реестра будут виртуализированы так же, как операции из приложения Legacy (и из -за этого будет работать на одних и тех же ключах). Это не работает так, как ожидалось, и единственный обходной путь, который я знаю, - это специально получить доступ к пути VirtualStore, Если пользователь работает Vista или 7 и включен UAC... Кажется некрасивым, особенно если Microsoft решает изменить поведение виртуализации в будущих версиях Windows.
Решение
Статья MSDN Виртуализация реестра в Windows Vista объясняет, что определенные классы процессов отключены виртуализации:
- 64-битные процессы
- Исполняемые файлы с запросом, указанным в манифесте
- и некоторые другие; Проверьте статью для получения подробной информации
Один или оба из первых двух, как правило, верны для приложения .NET (из-за манифеста по умолчанию по умолчанию. Вам придется удалить манифест (так, чтобы ваше приложение выглядело как устаревшее приложение), чтобы включить виртуализацию, но это была бы плохая идея (для совместимости вперед с Windows). Вместо этого просто предположим, что ваше приложение не виртуализируется на Vista (а затем и позже) и продолжается соответственно.
Кроме того, в статье предупреждается, что «Microsoft намерена удалить эту форму виртуализации из будущих версий операционной системы Windows ... Непонжно, что ваше приложение не требует жесткой зависимости от наличия виртуализации в системе». Какой бы код, который вы пишете, должен предвидеть, что ключ VirtualStore может не существовать в будущей версии Windows.