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

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

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

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

Я ожидал, что решение будет простым. В Vista и XP есть папки с общими данными приложений, предназначенные для этой цели. ("\ ProgramData" в Vista, "\ Documents and Settings \ All Users \ Application Data" в XP.) .NET Вызов Environment.GetFolderPath (SpecialFolder.CommonApplicationData) существует для поиска путей к этим папкам на данном ПК, да, да!

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

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

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

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


person Lyman Enders Knowles    schedule 16.09.2008    source источник
comment
Вот что происходит с людьми, которые пытаются удаленно делать что-нибудь сложное в проекте установки Visual Studio.   -  person ACK_stoverflow    schedule 10.05.2012


Ответы (7)


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

Чтобы поместить данные в подкаталог папки Common Application Data из проекта установки VS2008, выполните следующие действия:

  1. Щелкните правой кнопкой мыши свой проект установки в обозревателе решений и выберите «Просмотр -> Файловая система».

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

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

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

  5. Поразитесь на мгновение нелепому (но неоспоримому) факту, что существует свойство папки с именем «Свойство».

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

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

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

person Lyman Enders Knowles    schedule 01.10.2008
comment
хорошая запись, раньше я всегда создавал пути в коде. гораздо приятнее делать в установщике. - person Darren Kopp; 04.10.2008
comment
Комбинация переменных установщика должна выглядеть так: [CommonAppDataFolder] [Manufacturer] \ [ProductName] \ ... - person Matze; 30.06.2010
comment
это устанавливает файл для всех пользователей, что, если я хочу, чтобы он был установлен только для текущего пользователя? - person Smith; 25.03.2013
comment
vs setup project не поддерживает таблицу LockPermissions в спецификации MSI, переключитесь на другой инструмент или напишите настраиваемое действие для изменения разрешения для созданной вами папки. - person Sheng Jiang 蒋晟; 06.04.2013

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

  1. Добавлено настраиваемое действие для вызова устанавливаемого приложения (в качестве альтернативы вы можете создать отдельную программу / dll и вместо этого вызвать ее)
  2. Установите для свойства «Аргументы» значение «Установить».
  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» может привести к тому, что пользователь увидит нежелательный запрос при запуске приложения. Выполнение этого, как описано выше, предотвратит это. Я надеюсь, что это помогает кому-то. Я знаю, что мне было бы полезно увидеть что-то подобное несколько дней назад!

person ejwipp    schedule 08.12.2010
comment
Думаю, BuiltinUsersSid вместо WorldSid было бы более подходящим. В остальном ваш код работает нормально. - person OneWorld; 25.02.2013

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

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

person Community    schedule 29.01.2009

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

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

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

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. Эта часть взята из здесь < / а>. В конструкторе DataSet найдите свойства DataSet, откройте узел Connection и отредактируйте свойство ConnectionString, чтобы оно выглядело следующим образом:

Data Source=|DataDirectory|\YourDatabase.sdf

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

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

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

person cdonner    schedule 12.04.2009

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

  1. Щелкните правой кнопкой мыши свой проект установки в обозревателе решений и выберите «Просмотр -> Файловая система».

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

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

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

  5. Поразитесь на мгновение нелепому (но неоспоримому) факту, что существует свойство папки с именем «Свойство». Младенцы, полные бешенства, кто придумывает это дерьмо?

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

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
person Ahmad    schedule 18.05.2012

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

[CommonAppDataFolder]\[Manufacturer]\[ProductName]

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

person Community    schedule 17.12.2008

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

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

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

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

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

person Community    schedule 12.11.2008