Как сохранить настройки для всех пользователей под Vista - PullRequest
5 голосов
/ 10 октября 2009

Мне нужно сохранить настройку, которая затем будет доступна всем пользователям приложения на данном компьютере. Он должен работать в Vista / Win 7, и приложение не будет запускаться от имени администратора.

  • Невозможно сохранить в программный каталог как папка Program Files защищена на Vista
  • Невозможно сохранить в HKEY_LOCAL_MACHINE как это тоже защищено
  • Невозможно сохранить на сервере или в веб-сервисе

Где я могу сохранить данные? Даже если права приложений были каким-то образом повышены во время выполнения, меня беспокоит то, что реестр теперь виртуализирован в Vista - и поэтому я получу специальный HKEY_LOCAL_MACHINE, который фактически предназначен только для текущего пользователя.

Я использую .NET

Ответы [ 3 ]

9 голосов
/ 10 октября 2009

Общие данные приложения

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

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

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

8 голосов
/ 10 октября 2009

Как правильно ответил Квинтин, вы ищете путь% ALLUSERSPROFILE% (Environment.SpecialFolder.CommonApplicationData в .NET).

При этом следует помнить две важные вещи:

  • Хорошей практикой является создание подпапки для вашей компании и приложения с помощью установщика вашего приложения. Например:

    Dim DataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
    DataPath = IO.Path.Combine(DataPath, "ACME Corp.")
    DataPath = IO.Path.Combine(DataPath, "Widget App")
    DataPath = IO.Path.Combine(DataPath, "1.0") '//Optional, but possibly handy to easily migrate configuration files across major app versions
    
  • Хотя все пользователи будут иметь доступ на чтение к созданной вами папке, доступ на запись по умолчанию ограничен учетной записью, создавшей папку, а также членами группы «Администраторы» и LocalSystem. Если все пользователи должны иметь возможность изменять общий файл конфигурации (созданный одним пользователем, но переписанный другим пользователем, не являющимся администратором), вам необходимо явно организовать этот доступ. Опять же, это лучше всего сделать из установщика вашего приложения, но это можно сделать и из кода, например, при первом запуске приложения:

    Dim di As New IO.DirectoryInfo(DataPath)
    Dim ds = di.GetAccessControl
    ds.AddAccessRule(New Security.AccessControl.FileSystemAccessRule(...))
    di.SetAccessControl(ds)
    
0 голосов
/ 26 мая 2013

Вот обходной путь, который позволяет сохранить настройки для всех пользователей:

  1. Поместите файл настроек в программные файлы для чтения вашим приложением.
  2. Чтобы изменить этот файл настроек, создайте новое приложение, предназначенное для записи в файл настроек.
  3. Запустите это приложение, изменяющее настройки, из вашего основного приложения с глаголом, установленным на «run as»

    Process p = new Process();
    p.StartInfo = new ProcessStartInfo("changeXMLSettings.exe");
    p.StartInfo.Verb = "runas";
    p.Start();
    

Это запросит повышение прав и даст настройкам, изменяющим настройки, разрешение на запись в каталог программных файлов.

...