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

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

антропоиды и лилии и лопасти!

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

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

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

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

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

В проекте Setup содержится папка "Данные пользовательских приложений", но это папка для каждого пользователя, чего я пытаюсь избежать, да, да!

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

4b9b3361

Ответ 1

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

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

  • Щелкните правой кнопкой мыши проект установки в Обозревателе решений и выберите "Просмотр → Файловая система".

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

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

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

  • Поразите на какое-то смешное (но неопровержимое) утверждение о том, что есть свойство папки с именем "Свойство".

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Data Source=|DataDirectory|\YourDatabase.sdf

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

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

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

Ответ 6

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

  • Щелкните правой кнопкой мыши проект установки в Обозревателе решений и выберите "Просмотр → Файловая система".

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

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

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

  • Поразите на какое-то смешное (но неопровержимое) утверждение о том, что есть свойство папки с именем "Свойство". Младенцы, полные бешенства, которые придумывают это дерьмо?

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

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

Ответ 7

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

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

          

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

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

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