Где сохранить настройки программы вместо HKEY_LOCAL_MACHINE?
У меня есть некоторые настройки программы, которые в настоящее время хранятся в HKEY_LOCAL_MACHINE. Из-за Vista и заблокированных пользователей некоторые пользователи не имеют разрешения на HKEY_LOCAL_MACHINE, и эти значения на самом деле не принадлежат HKEY_LOCAL_USER (они должны быть одинаковыми для всех пользователей), каково наилучшее альтернативное место для их хранения?
Большинство настроек уже хранятся в БД, но есть некоторые из них, о которых должна знать программа перед подключением к БД. В идеале мне понравится способ реализовать это без необходимости проверки операционной системы.
Это для настольного приложения, написанного на Delphi.
Ответы
Ответ 1
Вы должны поставить:
- личные настройки (например, положение окна и незначительные настройки) в разделе
HKEY_CURRENT_USER
в реестре или в папке CSIDL_APPDATA
или CSIDL_LOCAL_APPDATA
;
- важные параметры приложения (например, фиксированный путь, который не должен быть изменен вашими пользователями) в разделе
HKEY_LOCAL_MACHINE
в реестре или в папке приложения. Установите их во время установки, когда доступны права администратора;
- общие данные (данные, которые все ваши пользователи должны читать и писать, как простая база данных) в папке
CSIDL_COMMON_APPDATA
.
Используйте SHGetFolderPath, чтобы найти расположение CSIDL_*
.
В зависимости от ваших потребностей вы можете использовать сразу все три варианта. В этом не было бы ничего плохого.
Ответ 2
Возможно, в реестре может быть какое-то хорошее место, но я не знаю, но почему бы просто не добавить ini файл в C:\Documents and Settings\All Users\Application Data\yourApp
Ответ 3
Что @uli, за одним исключением.
Настройки, которые никогда не изменяются или должны быть изменены администратором, могут... быть сохранены в той же папке, что и приложение, чтобы предотвратить вмешательство.
Информация о подключении для базы данных звучит как вещь, которая не должна изменяться без вмешательства администратора. Поэтому в этом случае папка вашего приложения может быть в порядке.
Ответ 4
Сохранить материал в% APPDATA% или% LOCALAPPDATA%
Ответ 5
Вы упомянули HKEY_LOCAL_USER, но я не вижу этого на верхнем уровне в реестре. Я предполагаю, что вы должны иметь в виду HKEY_CURRENT_USER.
Я установил свои пользовательские настройки под HKEY_CURRENT_USER/Software/my-program. Я считаю, что это работает под Vista без проблем.
Но поскольку вы говорите, что у вас есть настройки, которые применяются ко всем пользователям, которых вы не хотите использовать в HKEY_CURRENT_USER, вы можете попробовать либо:
HKEY_USERS/.DEFAULT/Программное обеспечение/ваш-программа
или
HKEY_CURRENT_CONFIG/Программное обеспечение/ваш-программа
Я боюсь, что не использую ни одно из этих мест, поэтому я не могу сказать вам, работают ли они в Vista или нет, но я вижу, что некоторые поставщики программного обеспечения добавили туда записи реестра.
Ответ 6
Спросите себя, действительно ли ваша настройка для всех пользователей. Это действительно для всех пользователей?
Осторожно подумайте об этом вопросе:
Как программное обеспечение запускалось под Windows XP в качестве стандартного пользователя?
- Неужели программное обеспечение просто сработало?
- Была ли настройка опции отключена?
- Вы сказали своим клиентам, что они должны были работать как администратор, и если они отказались, вы бы не поддержали его?
Потому что, если ваше программное обеспечение абсурдно требует от вас быть администратором, просто добавьте манифест в исполняемый файл, говоря, что он должен запускаться как администратор:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="IsUserAdmin"
type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
И престо, вы администратор.
Но я не думаю, что вам действительно нужно быть администратором. Единственный раз, когда вам нужен параметр локальной машины, если у вас будут пользователи из нескольких логинов или сеансов с помощью программного обеспечения. Если это действительно относится к каждому пользователю, не должна ли программа установки установить его?
У нас возник такой же вопрос. Система наблюдения должна настроить, какое устройство захвата будет использоваться программным обеспечением. Вы могли бы сказать, что все операторы наблюдения будут использовать одно и то же устройство захвата, поэтому, как только он его выбирает, эта настройка является глобальной для всех операторов. Но это просто неверно на практике. Скорее всего, есть только одно устройство захвата, и это тот, который мы используем. Если их несколько, тогда пользователь может просто выбрать другое устройство.
Но есть несколько способов справиться с этим
i) Сохраните настройки в реестре и установите программу установки ACL на ключ, чтобы дать всем пользователям полный контроль.
ii) Сохраните настройки в
% APPDATA%\Surveillance\settings.ini
файл. Попросите программу установки создать файл настроек и ACL, чтобы все пользователи имели полный доступ
iii) Сохраните настройки в вышеупомянутом разделе реестра или ini файле и используйте
чтобы добавить UAC Shield в кнопку Сохранить/ ОК/ Применить. Когда пользователь нажимает кнопку, вы перезапускаете свое приложение повышенным (используя RunAsAdmin), передавая параметры командной строки, указывающие, что вы хотите изменить.
iv) Сделайте то же самое, что и 3, но сделайте это, прежде чем они смогут попасть на экран, который используется для редактирования значений.
v) Сделайте то же, что и 4, но сначала сохраните значения, только если они хотят их изменить, они должны поднять.
vi) Отключить опции, если пользователь работает как стандартный пользователь, и если они хотят их изменить: щелкните правой кнопкой мыши исполняемый файл и выберите
Запуск от имени администратора
Если это вариант, который пользователь мог изменить, когда захочет (когда вы работали в Windows XP, а пользователь был администратором), то кажется, что пользователь может редактировать значение по желанию.
В этом случае вы можете просто ввести имя пользователя в имя сервера, так как им было разрешено делать это раньше. Если у пользователя есть разрешение на запись в HKLM, сохраните его там. В противном случае сохраните его в HKCU. Когда вы читаете, какой сервер использовать, начните с HKCU и перейдите в HKLM, если значение HKCU там отсутствует.
Ответ 7
Повторите использование ini файлов - будьте осторожны, что, как представляется, предел 2048 byte
для элементов.
Я израсходовался из-за этого - информация о закодированной лицензии зависала вокруг (тогда неизвестного) предел и что-то, что всегда казалось нарушающим "таинственным образом", когда они переходят...
Ответ 8
Можете ли вы создать файл .msi, который можно использовать для вытеснения параметров реестра из групповой политики?
Ответ 9
Всегда есть старомодные файлы INI. Они более переносят настройки реестра. Другим вариантом будет XML файл.
Не храните их в каталоге Program Files, но Vista не понравится.
Ответ 10
Я прочитал все ответы здесь и прочее в другом месте, и ответ кажется... Не используйте реестр! Это действительно то, что Microsoft хочет, чтобы мы сделали с данными конфигурации программы, которые применяются ко всем пользователям!?