Проект установки VS2008: общие (все пользователи) файлы данных приложения? - PullRequest
31 голосов
/ 17 сентября 2008

собратьев-антропоидов, лилий и колесиков!

Я разрабатываю настольное приложение для 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 .GetFolderPath (SpecialFolder.CommonApplicationData) существует для поиска путей к этим папкам на данном ПК, да, да!

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

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

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

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

Ответы [ 7 ]

20 голосов
/ 02 октября 2008

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

Чтобы поместить материал в подкаталог папки Common Application Data из проекта установки 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". Интересно, в чем смысл папки Common Application Data?

10 голосов
/ 09 декабря 2010

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

  1. Добавлено пользовательское действие для вызова устанавливаемого приложения (альтернативно вы можете создать отдельную программу / dll и вызывать ее вместо этого)
  2. Установите свойство Arguments равным "Install"
  3. Изменено Main в Program.cs для проверки этого аргумента:
    <code><br>
    static void Main(string[] args)
    {
       if (args != null && args.Length > 0 && args[0] == "Install")
       {
          ApplicationData.SetPermissions();
       }
       else
       {
          // Execute app "normally"
        }
    }
    
  4. Написал функцию SetPermissions для программного изменения разрешений
    <code><br>
    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<br>
            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» может привести к тому, что пользователь увидит нежелательное приглашение при запуске приложения. Выполнение, как описано выше, предотвратит это. Я надеюсь, что это помогает кому-то. Я знаю, что мог бы выиграть, увидев нечто подобное несколько дней назад!

6 голосов
/ 29 января 2009

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

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

1 голос
/ 18 мая 2012

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

  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); 
1 голос
/ 12 апреля 2009

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

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

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

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

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

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

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

1 голос
/ 17 декабря 2008

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

[CommonAppDataFolder] [Производитель] [ProductName]

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

0 голосов
/ 12 ноября 2008

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

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

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

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

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

...