2008-08-03 3 views
15

Я пытаюсь поддерживать проект установки в Visual Studio 2003 (да, это устаревшее приложение). В настоящий момент проблема заключается в том, что нам необходимо записать записи реестра в HKCU для каждого пользователя на компьютере. Они должны быть в HKCU, а не HKLM, потому что они являются настройками пользователя по умолчанию, и они изменяются для каждого пользователя. У меня такое ощущение, чтоПроект установки Visual Studio - для настроек реестра пользователя

  1. Это невозможно
  2. Это не то, что установщик должен делать, но что-то приложение должно делать (в конце концов, что происходит, когда профиль пользователя создается после установки ?).

Имея это в виду, я все еще хочу, чтобы изменить как можно меньше в применении, поэтому мой вопрос, можно ли добавлять записи реестра для каждого пользователя в проекте в Visual Studio 2003 настройки?

И, на данный момент проект перечислены пять корневых ключей реестра (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS и User/Machine Hive). Я ничего не знаю о корневом ключе Users и не видел User/Machine Hive. Может ли кто-нибудь просветить меня на том, кто они? Возможно, они могли решить мою проблему выше.

+0

спасибо за этот вопрос – 2009-03-15 21:17:00

ответ

5

Первый: Да, это то, что принадлежит в Заявке для точных резонансов вы указали: Что происходит после того, как новые пользовательские профили создаются? Конечно, если вы используете домен, возможно, что в реестре есть какие-то вещи, но это не совсем так. Приложение должно проверить, есть ли синтаксисы и использовать настройки по умолчанию, если нет.

Это, как говорится, можно изменить других пользователей. Ключи через HKEY_USERS Hive.

У меня нет опыта работы с проектом Visual Studio 2003 Setup, поэтому здесь немного (полностью несвязанной) VBScript код, который может просто дать вам представление о том, где искать:

const HKEY_USERS = &H80000003 
strComputer = "." 
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") 
strKeyPath = "" 
objReg.EnumKey HKEY_USERS, strKeyPath, arrSubKeys 
strKeyPath = "\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing" 
For Each subkey In arrSubKeys 
    objReg.SetDWORDValue HKEY_USERS, subkey & strKeyPath, "State", 146944 
Next 

(код, предоставленный Jeroen Ritmeijer)

1

Я поступил на свое решение с этой записью на MSDN (не знаю, как я не мог найти его раньше).

Пользователь/Machine Hive
подразделы и значения, введенные в соответствии с настоящим улье будет установлен в кусте HKEY_CURRENT_USER, когда пользователь выбирает «Just Me» или улей HKEY_USERS или когда пользователь выбирает «Все» во время установки.

Registry Editor

5

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

ЗДЕСЬ БЫТЬ DRAGONS

Скажем, Джо и Джейн регулярно входить на компьютер, то каждый из них будет иметь «реестрами».

После этого вы установите свое приложение, и установщик будет использовать гигантские хаки и отвратительные вещи для установки элементов под HKCU для них.

ТОГДА, Боб придет и войдет в систему (он и еще 500 человек имеют учетные записи в домене и могут это сделать). Он никогда не использовал этот компьютер раньше, поэтому у него нет реестра. При первом входе в систему окна создают его, но у него не будет настройки.

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

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

1

Несмотря на то, что MSDN article говорит об User/Machine Hive, напишите HKEY_USERS. Скорее он пишет в HKCU, если вы выберете Just Me и HKLM, если вы выберете всех.

Таким образом, мое решение будет состоять в использовании куста User/Machine, а затем в приложении оно проверяет, находятся ли записи реестра в HKCU, а если нет, копирует их из HKLM. Я знаю, что это, вероятно, не самый идеальный способ сделать это, но он имеет наименьшее количество изменений.

Смежные вопросы