Проект установки 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? Может ли кто-нибудь сказать мне, как?
Ответы
Ответ 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 Vistap >
Ответ 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 ограничила этот материал
заключается в том, чтобы убрать вредоносный код с компьютеров, где пользователь не знает
от того, что они устанавливают.
Итак, это не сработает, если вам нужен другой каталог.
Это исправление позволяет вам указать, где
в вашем приложении для поиска файлов......