Доступ к реестру с повышенными правами Windows 7

Я работаю над установщиком для нашего приложения. Программа установки вносит некоторые изменения в раздел реестра HKEY_CURRENT_USER \ Software \ Company \ AppName, который приложение затем ищет при первом запуске. Затем приложение выполняет разные действия в зависимости от найденных ключей реестра.

Это отлично работает, пока вы не попытаетесь установить приложение как учетную запись пользователя (т.е. не администратора) в Windows 7 (и, возможно, в Vista, я еще не тестировал это).

Когда пользователь пытается установить приложение, Windows получает учетные данные администратора. Это означает, что любые изменения HKCU в реестре вносятся в реестр администратора, а не реестр запускающего пользователя. Таким образом, ключи не видны приложению при первом запуске под учетной записью пользователя.

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

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

Изменить: приложению необходимо удалить ключи после их использования, поэтому я не могу просто поместить их в HKEY_LOCAL_MACHINE.


person Colen    schedule 09.12.2010    source источник
comment
Как бы то ни было, Microsoft в целом пересмотрела свои рекомендации, чтобы не сохранять пользовательские настройки и данные конфигурации в реестре. Если у вас нет его в реестре, почему бы не использовать что-то вроде файла XML или INI, для которого не требуются специальные разрешения на доступ?   -  person Cody Gray    schedule 09.12.2010
comment
Подождите, они сделали? Для чего еще реестр? :(   -  person Colen    schedule 09.12.2010
comment
Многие думают, что Реестр больше ни для чего не нужен. Это был подходящий дизайн много лет назад, когда он был задуман, но, возможно, он изжил себя, и его проблемы, похоже, превзошли преимущества. Кроме того, поскольку реестр все еще используется, он предназначен для использования только в Windows, а не для приложений, сбрасывающих данные пользователя. Здесь, о SO, есть еще пара вопросов о современной полезности реестра, но в сети циркулирует гораздо больше дезинформации. Это просто то, что нужно учитывать, и это стало еще более важным с UAC и т. Д.   -  person Cody Gray    schedule 10.12.2010


Ответы (2)


Есть 2 рекомендуемых подхода к тому, что вы хотите:

  1. Используйте установку для каждого пользователя, которая не требует прав администратора. Вы сможете использовать HKEY_CURRENT_USER, но ваш продукт установлен не для всех пользователей.

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

По сути, если ваше приложение предназначено для каждой машины, оно должно использовать HKEY_LOCAL_MACHINE или файл конфигурации. Если это для каждого пользователя, вы можете использовать HKEY_CURRENT_USER. Любая другая комбинация имеет ограничения и не будет работать так, как вам нужно.

person cosmin    schedule 09.12.2010

Если вам нужно, чтобы информация о вашем приложении была доступна всем пользователям, используйте куст HKEY_LOCAL_MACHINE.

РЕДАКТИРОВАТЬ - 2 альтернативы:

  • Измените безопасность ключей реестра, чтобы пользователи могли редактировать / удалять их,
  • Используйте ProgramData (вместо реестра) для хранения данных.
person ZippyV    schedule 09.12.2010
comment
Отредактировано, чтобы добавить к исходному вопросу: приложению необходимо удалить ключи после их использования, поэтому я не могу просто поместить их в HKEY_LOCAL_MACHINE. В противном случае хорошее предложение. - person Colen; 09.12.2010