Проект настройки VS2008:Общий доступ (для всех пользователей) Файлы данных приложения?

StackOverflow https://stackoverflow.com/questions/76760

Вопрос

собратья антропоиды, листики кувшинок и гребные колеса!

Я разрабатываю настольное приложение для Windows на C # / .NET / WPF, используя VS 2008.Приложение необходимо для установки и запуска на компьютерах с Vista и XP.Я работаю над проектом установки / Windows Installer для установки приложения.

Моему приложению требуется доступ на чтение / изменение / запись к файлу базы данных SQLCE (.sdf) и некоторым другим файлам типа базы данных, связанным со сторонним элементом управления, который я использую.Эти файлы должны быть доступны всем пользователям / регистраторам на компьютере, ни от одного из которых не может требоваться быть администратором.Это, конечно, означает, что файлы не могут размещаться в собственном каталоге установки программы (как это часто делалось до появления Vista, да, да!).

Я ожидал, что решение будет простым. И в Vista, и в XP есть папки shared-application-data, предназначенные для этой цели. ("\ProgramData" в Vista, "\Documents and Settings\All Users\Данные приложения" в XP.) Среда .NET.GetFolderPath(специальная папка.CommonApplicationData) существует вызов для поиска путей к этим папкам на данном компьютере, да, да!

Но я не могу понять, как указать папку shared-application-data в качестве целевого объекта в проекте установки.

Проект установки предлагает папку "Общие файлы", но она предназначена для общих программных компонентов (не файлов данных), обычно располагается в разделе "\Program Files" и имеет те же ограничения безопасности, что и все остальное в "\Program files", да, да!

Проект установки предлагает папку "Данные приложения пользователя", но это папка для каждого пользователя, чего я именно и пытаюсь избежать, да, да!

Можно ли добавить файлы в папку shared-app-data надежным способом для разных версий Windows из проекта установки VS 2008?Кто-нибудь может сказать мне, как это сделать?

Это было полезно?

Решение

Я узнал ответ на свой вопрос из других источников, да, да!К сожалению, это не решило мою проблему!Что это значит для меня - мастер на все руки?Да, да!

Чтобы поместить материал в подкаталог общей папки данных приложения из проекта установки VS2008, вот что вы делаете:

  1. Щелкните правой кнопкой мыши ваш проект установки в Обозревателе решений и выберите "Вид -> Файловая система".

  2. Щелкните правой кнопкой мыши "Файловая система на целевом компьютере" и выберите "Добавить специальную папку -> Пользовательская папка".

  3. Переименуйте пользовательскую папку в "Общая папка данных приложения". (Это не то имя, которое будет использоваться для результирующей папки, это просто для того, чтобы помочь вам разобраться в ней.)

  4. Измените свойство DefaultLocation папки на "[CommonAppDataFolder][Производитель]\[ProductName]".Обратите внимание на сходство со свойством DefaultLocation папки приложения, включая странное использование одной обратной косой черты.

  5. Поразитесь на мгновение нелепому (но неоспоримому) факту существования свойства папки с именем "Property".

  6. Измените свойство свойства папки на "COMMONAPPDATAFOLDER".

Файлы данных, помещенные в папку "Общие данные приложения", будут скопированы в "\ProgramData\Manufacturer\ProductName" (в Vista) или "\Documents and Settings\All Users\Application Data\Manufacturer\ProductName" (в XP) при запуске программы установки.

Теперь выясняется, что в Vista лица, не являющиеся администраторами, не получают права на изменение / запись к файлам, находящимся здесь.Таким образом, все пользователи могут читать файлы, но они также получают их в "\Program Files".Итак, интересно, в чем же смысл общей папки данных приложения?

Другие советы

Вместо того чтобы устанавливать флажок "Включить параметры безопасности ClickOnce" и выбирать "Это приложение с полным доверием", можно изменить разрешения каталога CommonAppDataDirectory вашего приложения с помощью пользовательского действия в разделе "установка" проекта установки.Вот что я сделал:

  1. Добавлено пользовательское действие для вызова устанавливаемого приложения (в качестве альтернативы вы могли бы создать отдельную программу / dll и вызвать ее вместо этого)
  2. Установите для свойства Arguments значение "Установить".
  3. Изменил Main в Program.cs, чтобы проверить наличие этого аргумента:

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. Написал функцию SetPermissions для программного изменения разрешений

    public static void SetPermissions() { String path = GetPath(); try { // Create security idenifier for all users (WorldSid) SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(); // add a new file access rule w/ write/modify for all users to the directory security object
    ds.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, // all sub-dirs to inherit PropagationFlags.None, AccessControlType.Allow)); // Turn write and modify on // Apply the directory security to the directory di.SetAccessControl(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

Поскольку установщик запускается с правами администратора, программа сможет изменять разрешения.Я где-то читал, что "Включить безопасность ClickOnce" может привести к тому, что пользователь увидит нежелательное приглашение при запуске приложения.Выполнение действий, описанных выше, предотвратит это.Я надеюсь, что это кому-то поможет.Я знаю, что несколько дней назад мне было бы полезно увидеть нечто подобное!

Я решил это таким образом.Я сохранил файл базы данных (.sdf) в той же папке, в которой установлено приложение (Application Folder).На вкладке безопасность в окне свойств основного проекта я проверил "Включить параметры безопасности ClickOnce" и выбрал "Это приложение с полным доверием", перестроил и запустил установку.После этого никаких проблем с безопасностью не возникнет

Я использую Visual Studio 2008 и Windows Vista

Это сработало у меня с использованием VS2005, но мне пришлось изменить DefaultLocation, я добавил '\', чтобы отделить CommonAppDataFolder.

[CommonAppDataFolder] [Производитель] [Название продукта]

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

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

Чтобы избежать этой проблемы, я просто хочу установить базу данных в папку "Все пользователи / Данные приложения", независимо от того, было ли приложение установлено для одного пользователя или для всех пользователей.Я, конечно, понимаю, что два пользователя не смогли бы установить приложение на один компьютер, не перезаписав данные друг друга.Однако это настолько маловероятная возможность, что я не хочу ее рассматривать.

Первый кусочек головоломки, который у меня получился здесь:

Form_Load(object sender, EventArgs e)
{
  // Set the db directory to the common app data folder
  AppDomain.CurrentDomain.SetData("DataDirectory", 
            System.Environment.GetFolderPath
           (System.Environment.SpecialFolder.CommonApplicationData));
}

Теперь нам нужно убедиться, что источник данных содержит заполнитель DataDirectory.Этот фрагмент взят из здесь.В конструкторе наборов данных найдите свойства набора данных, откройте узел Подключения и отредактируйте свойство ConnectionString, чтобы оно выглядело следующим образом:

Data Source=|DataDirectory|\YourDatabase.sdf

Затем я последовал приведенным выше инструкциям Лаймана Эндерса Ноулза о том, как добавить папку Common Application Data в проект установки, и поместил файл базы данных в эту папку.

Затем я последовал предложению Уве, приведенному выше, т.е.Я проверил "Включить настройки безопасности ClickOnce" и выбрал "Это приложение с полным доверием.

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

мне нравится концепция, приведенная ниже, некоторые вещи взяты сверху

  1. Щелкните правой кнопкой мыши ваш проект установки в Обозревателе решений и выберите "Вид -> Файловая система".

  2. Щелкните правой кнопкой мыши "Файловая система на целевом компьютере" и выберите "Добавить специальную папку -> Пользовательская папка".

  3. Переименуйте пользовательскую папку в "Общая папка данных приложения". (Это не то имя, которое будет использоваться для результирующей папки, это просто для того, чтобы помочь вам разобраться в ней.)

  4. Измените свойство DefaultLocation папки на "[CommonAppDataFolder][Производитель][ProductName]".Обратите внимание на сходство со свойством DefaultLocation папки приложения, включая странное использование одной обратной косой черты.

  5. Поразитесь на мгновение нелепому (но неоспоримому) факту существования свойства папки с именем "Property". Дети, полные бешенства, кто придумал это дерьмо?

  6. Измените свойство свойства папки на "COMMONAPPDATAFOLDER".

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

Я не уверен, поможет ли это в вашем случае или нет.

Но если вы добавите закрытый раздел в конфигурационный файл вашего приложения

Вы можете указать дополнительные папки для проверки в своем приложении.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top