Подтвердить что ты не робот

Где сохранить настройки программы вместо HKEY_LOCAL_MACHINE?

У меня есть некоторые настройки программы, которые в настоящее время хранятся в HKEY_LOCAL_MACHINE. Из-за Vista и заблокированных пользователей некоторые пользователи не имеют разрешения на HKEY_LOCAL_MACHINE, и эти значения на самом деле не принадлежат HKEY_LOCAL_USER (они должны быть одинаковыми для всех пользователей), каково наилучшее альтернативное место для их хранения?

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

Это для настольного приложения, написанного на Delphi.

4b9b3361

Ответ 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 хочет, чтобы мы сделали с данными конфигурации программы, которые применяются ко всем пользователям!?