Поделиться через


Виртуализация реестра

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

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

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

Дополнительные сведения о создании приложений, совместимых с UAC, см. в руководстве разработчика по UAC.

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

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

Виртуализацию реестра можно разделить на следующие типы:

Открытие виртуализации реестра

Если вызывающий объект не имеет доступа на запись к ключу и пытается открыть ключ, ключ открывается с максимально допустимым доступом для этого вызывающего объекта.

Если для ключа установлен флаг REG_KEY_DONT_SILENT_FAIL, операция завершается сбоем и ключ не открывается. Дополнительные сведения см. в разделе Управление виртуализацией реестра далее в этом разделе.

Виртуализация реестра на запись

Если вызывающий объект не имеет доступа на запись к ключу и пытается записать в него значение или создать подраздел, значение записывается в виртуальное хранилище.

Например, если ограниченный пользователь пытается записать значение в следующий ключ: HKEY_LOCAL_MACHINE\Software\AppKey1, виртуализация перенаправляет операцию записи в HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\AppKey1.

Чтение виртуализации реестра

Если вызывающий объект считывает из виртуализированного ключа, реестр представляет вызывающей стороне объединенное представление как виртуализированных значений (из виртуального хранилища), так и не виртуальных значений (из глобального хранилища).

Например, предположим, что HKEY_LOCAL_MACHINE\Software\AppKey1 содержит два значения V1 и V2 и что ограниченный пользователь записывает значение версии 3 в ключ. Когда пользователь пытается считывать значения из этого ключа, объединенное представление включает значения V1 и V2 из глобального хранилища и значение V3 из виртуального хранилища.

Обратите внимание, что виртуальные значения имеют приоритет над глобальными значениями при их наличии. В приведенном выше примере, даже если глобальное хранилище имеет значение V3 под этим ключом, значение V3 по-прежнему будет возвращено вызывающему объекту из виртуального хранилища. Если бы версия 3 была удалена из виртуального хранилища, то версия 3 будет возвращена из глобального хранилища. Другими словами, если бы версия 3 была удалена из HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\AppKey1 , но уHKEY_LOCAL_MACHINE\Software\AppKey1 было значение версии 3, это значение будет возвращено из глобального хранилища.

Область виртуализации реестра

Виртуализация реестра включена только для следующих компонентов:

  • 32-разрядные интерактивные процессы.
  • Ключи вHKEY_LOCAL_MACHINE\Software.
  • Ключи, в которые может записывать администратор. (Если администратор не может выполнить запись в ключ, приложение завершилось бы сбоем в предыдущих версиях Windows, даже если оно было запущено администратором.)

Виртуализация реестра отключена для следующих компонентов:

  • 64-разрядные процессы.

  • Процессы, которые не являются интерактивными, например службы.

    Обратите внимание, что использование реестра в качестве механизма межпроцессного взаимодействия (IPC) между службой (или любым другим процессом, для которых не включена виртуализация) и приложением, будет работать неправильно, если ключ виртуализирован. Например, если антивирусная служба обновляет свои файлы подписи на основе значений, заданных приложением, служба никогда не обновляет свои файлы подписи, так как служба считывает данные из глобального хранилища, но приложение записывает данные в виртуальное хранилище.

  • Процессы, которые олицетворяют пользователя. Если процесс пытается выполнить операцию при олицетворении пользователя, эта операция не будет виртуализирована.

  • Процессы в режиме ядра, такие как драйверы.

  • Процессы, запрашивающиеExecutionLevel , указанные в своих манифестах.

  • Ключи и подразделы HKEY_LOCAL_MACHINE\Software\Classes, HKEY_LOCAL_MACHINE\Software\Microsoft\Windowsи HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT.

Управление виртуализацией реестра

Помимо управления виртуализацией на уровне приложения с помощью requestedExecutionLevel в манифесте, администратор может включать или отключать виртуализацию для ключей в HKEY_LOCAL_MACHINE\Software. Для этого используйте параметр flags служебной программы командной строки Reg.exe с флагами, перечисленными в следующей таблице.

Flag Значение
REG_KEY_DONT_SILENT_FAIL Этот флаг отключает виртуализацию открытого реестра. Если этот флаг установлен и операция открытия завершается сбоем в разделе с включенной виртуализацией, реестр не пытается повторно открыть раздел. Если этот флаг не установлен, реестр пытается повторно открыть раздел с MAXIMUM_ALLOWED доступом вместо запрошенного доступа.
REG_KEY_DONT_VIRTUALIZE Этот флаг отключает виртуализацию реестра записи. Если этот флаг установлен и операция создания ключа или задания значения завершается сбоем, так как вызывающий объект не имеет достаточных прав доступа к родительскому разделу, то в реестре завершится сбой операции. Если этот флаг не задан, реестр пытается записать ключ или значение в виртуальном хранилище. Вызывающий объект должен иметь KEY_READ прямо на родительском ключе.
REG_KEY_RECURSE_FLAG Если этот флаг установлен, флаги виртуализации реестра распространяются из родительского раздела. Если этот флаг не задан, флаги виртуализации реестра не распространяются. Изменение этого флага влияет только на новые ключи-потомки, созданные после изменения флага. Он не устанавливает и не очищает эти флаги для существующих ключей-потомков.

 

В следующем примере показано использование служебной программы командной строки Reg.exe с параметром FLAGS для запроса состояния флагов виртуализации для ключа.

C:\>reg flags HKLM\Software\AppKey1 QUERY

HKEY_LOCAL_MACHINE\Software\AppKey1

        REG_KEY_DONT_VIRTUALIZE: CLEAR
        REG_KEY_DONT_SILENT_FAIL: CLEAR
        REG_KEY_RECURSE_FLAG: CLEAR

The operation completed successfully.

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

начало работы с контролем учетных записей пользователей

Общие сведения и настройка контроля учетных записей пользователей

Рекомендации и рекомендации для разработчиков для приложений в среде с минимальными привилегиями