VS2008安装项目:共享(所有用户)应用程序数据文件?

同胞anthropoids和睡莲叶和水轮!

我正在使用VS 2008在C#/ .NET / WPF中开发Windows桌面应用程序。该应用程序需要在Vista和XP计算机上安装和运行。 我正在安装/ Windows安装程序项目来安装应用程序。

我的应用程序需要对SQLCE数据库文件(.sdf)和与我正在使用的第三方控件相关的一些其他数据库types文件进行读取/修改/写入访问。 这些文件应该在个人电脑上的所有用户/login之间共享,任何一个都不需要成为pipe理员。 当然,这意味着这些文件不能进入程序自己的安装目录(在Vista到来之前,这样的事情经常发生,是的,是的!)。

我原本以为这个解决scheme很简单。 Vista和XP都有用于此目的的共享应用程序数据文件夹。 (在Vista中为“\ ProgramData”,XP中的“\ Documents and Settings \ All Users \ Application Data”)。存在.NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData)调用来查找指定PC上这些文件夹的path,是,是的!

但是我不知道如何在安装项目中指定shared-application-data文件夹作为目标。

安装项目提供了一个“公用文件”文件夹,但是这是为共享程序组件(而不是数据文件),通常位于“\ Program Files”下,并具有相同的安全限制,“\ Program Files文件”是的是的!

安装项目提供一个“用户的应用程序数据”文件夹,但这是一个每个用户的文件夹,这正是我想要避免的,是的,是的!

是否有可能从一个VS 2008安装项目以一种健壮的,跨Windows版本的方式将文件添加到shared-app-data文件夹? 谁能告诉我怎么样?

我通过其他渠道了解到我的问题的答案,是的,是的! 可悲的是,这并没有解决我的问题! 那是什么让我成为了修鞋匠? 是的是的!

把东西放在VS2008安装项目的通用应用程序数据文件夹的一个子目录中,这就是你要做的:

  1. 右键单击解决scheme资源pipe理器中的安装项目,然后select“查看 – >文件系统”。

  2. 右键单击“目标机器上的文件系统”,然后select“添加特殊文件夹 – >自定义文件夹”。

  3. 将自定义文件夹重命名为“通用应用程序数据文件夹”。 (这不是用于生成文件夹的名称,只是为了帮助您保持直观。)

  4. 将该文件夹的DefaultLocation属性更改为“[CommonAppDataFolder] [Manufacturer] \ [ProductName]”。 请注意与应用程序文件夹的DefaultLocation属性的相似性,包括奇怪使用单个反斜杠。

  5. 奇迹般的(但不可否认)的事实,有一个名为“属性”的文件夹属性。

  6. 将该文件夹的属性属性更改为“COMMONAPPDATAFOLDER”。

放置在“Common Application Data”文件夹中的数据文件将被复制到“\ ProgramData \ Manufacturer \ ProductName”(在Vista上)或“\ Documents and Settings \ All Users \ Application Data \ Manufacturer \ ProductName”安装程序运行。

现在事实certificate,在Vista下,非pipe理员不能修改/写访问这里的文件。 所以所有的用户都可以读取这些文件,但是也可以在“\ Program Files”中find。 那么,我想知道,通用应用程序数据文件夹的重点呢?

而不是检查“启用ClickOnce安全设置”,并select“这是一个完全信任的应用程序”,可以在安装项目的“安装”部分下使用自定义操作更改您的应用程序的CommonAppDataDirectory的权限。 以下是我所做的:

  1. 添加了一个自定义操作来调用正在安装的应用程序(或者你可以创build一个单独的程序/ DLL,而不是调用)
  2. 将Arguments属性设置为“Install”
  3. 在Program.cs中修改Main以检查该arg:

    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); } }

由于安装程序以pipe理员权限运行,程序将能够更改权限。 我在某处读“启用ClickOnce安全性”可能导致用户在应用程序启动时看到不希望的提示。 按照上述方法进行操作可以防止这种情况发生。 我希望这可以帮助别人。 我知道我可以从几天前看到这样的事情中受益!

我这样解决了 我将数据库文件(.sdf)保存在与安装应用程序(应用程序文件夹)相同的文件夹中。 在主项目的属性窗口中的安全选项卡上,我检查了“启用ClickOnce安全设置”,并select“这是一个完全信任的应用程序”,重build并运行设置。 之后,没有安全问题

我正在使用Visual Studio 2008和Windows Vista

这工作对我来说,使用VS2005,但我不得不改变DefaultLocation,我添加了一个'\'来分离CommonAppDataFolder。

[COMMONAPPDATAFOLDER] [生产] [ProductName]的

不知道这是否是一个错字,但是莱曼确实提到了单个反斜杠的奇怪用法,但是这看起来不正确。

我遇到过同样的问题。 安装项目为用户提供了安装“仅适用于当前用户”或“适用于所有用户”的应用程序的选项。因此,数据库文件将以当前用户或所有用户应用程序数据文件夹结尾。必须把这些信息写在某个地方,以便应用程序能够在以后访问数据库的时候检索它,否则它会怎么知道要查找哪个应用程序数据文件夹?

为了避免这个问题,我只想将数据库安装在“所有用户/应用程序数据”文件夹中,无论应用程序是为一个用户还是为所有用户安装的。 当然,我意识到两个用户不能在同一台计算机上安装应用程序而不会覆盖对方的数据。 但是,这是一个遥远的可能性,我不想考虑它。

我在这里得到的第一个难题是:

 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占位符。 这件作品来自这里 。 在DataSetdevise器中,findDataSet的属性,打开Connection节点并编辑ConnectionString属性,如下所示:

 Data Source=|DataDirectory|\YourDatabase.sdf 

然后,我按照上面的Lyman Enders Knowles的说明操作,以便如何将通用应用程序数据文件夹添加到安装项目中,并将数据库文件放在该文件夹中。

然后,我按照上面的Ove的build议,即我检查了“启用ClickOnce安全设置”,并select“这是一个完全信任的应用程序。

之后,应用程序在Vista上部署良好,数据库文件可以读取和写入。

我喜欢下面的概念,一些从上面的东西

  1. 右键单击解决scheme资源pipe理器中的安装项目,然后select“查看 – >文件系统”。

  2. 右键单击“目标机器上的文件系统”,然后select“添加特殊文件夹 – >自定义文件夹”。

  3. 将自定义文件夹重命名为“通用应用程序数据文件夹”。 (这不是用于生成文件夹的名称,只是为了帮助您保持直观。)

  4. 将该文件夹的DefaultLocation属性更改为“[CommonAppDataFolder] [Manufacturer] [ProductName]”。 请注意与应用程序文件夹的DefaultLocation属性的相似性,包括奇怪使用单个反斜杠。

  5. 奇迹般的(但不可否认)的事实,有一个名为“属性”的文件夹属性。 狂犬病的婴儿,谁提出这个狗屎?

  6. 将该文件夹的属性属性更改为“COMMONAPPDATAFOLDER”。

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

我不确定这是否有助于你的情况。

但是,如果你添加一个私人部分到你的应用程序的configuration文件

您可以指定额外的文件夹来检查您的应用程序。

如果你所说的是你想要能够安装到机器上的其他文件夹,那么这是一个问题。 从本质上来说,MS限制这些东西的全部原因是让用户不知道他们正在安装什么的恶意代码。

所以,如果你需要另一个目录,这将不起作用。 这个修复程序的作用是让你指定你的应用程序中的什么地方来search文件……