类人猿同胞、睡莲叶和水轮!

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

我的应用程序需要对 SQLCE 数据库文件 (.sdf) 以及与我正在使用的第三方控件相关的一些其他数据库类型文件进行读/修改/写访问。这些文件应在 PC 上的所有用户/登录名之间共享,其中任何一个都不需要成为管理员。当然,这意味着这些文件不能进入程序自己的安装目录(在 Vista 出现之前,这种事情经常发生,是的,是的!)。

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

但我不知道如何将共享应用程序数据文件夹指定为安装项目中的目标。

安装项目提供了一个“Common Files”文件夹,但该文件夹用于共享程序组件(而不是数据文件),通常位于“\Program Files”下,并且具有与“\Program files”中其他任何内容相同的安全限制,是的是的!

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

是否可以通过 VS 2008 安装项目以可靠的跨 Windows 版本的方式将文件添加到共享应用程序数据文件夹中?谁能告诉我怎么做?

有帮助吗?

解决方案

我通过其他来源了解到了我的问题的答案,是的,是的!可悲的是,它没有解决我的问题!是什么让我——一个修理工?是的是的!

要将内容放入 VS2008 安装项目的 Common Application Data 文件夹的子目录中,请执行以下操作:

  1. 在解决方案资源管理器中右键单击您的安装项目,然后选择“查看 -> 文件系统”。

  2. 右键单击“目标计算机上的文件系统”并选择“添加特殊文件夹 -> 自定义文件夹”。

  3. 将自定义文件夹重命名为“通用应用数据文件夹”。 (这不是将用于结果文件夹使用的名称,而是为了帮助您保持直率。)

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

  5. 有一个名为“Property”的文件夹属性,这个荒谬(但不可否认)的事实让您惊叹不已。

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

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

现在事实证明,在 Vista 下,非管理员无法修改/写入此处的文件。因此,所有用户都可以读取这些文件,但他们也可以在“\Program Files”中读取这些文件。那么,我想知道 Common Application Data 文件夹的意义何在?

其他提示

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

  1. 添加了一个自定义操作来调用正在安装的应用程序(或者您可以创建一个单独的程序/dll 并调用它)
  2. 将参数属性设置为“安装”
  3. 修改 Program.cs 中的 Main 以检查该参数:

    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 安全性”可能会导致用户在应用程序启动时看到不需要的提示。按照上述方法进行操作可以防止这种情况发生。我希望这可以帮助别人。我知道几天前看到这样的事情我可能会受益匪浅!

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

我使用的是 Visual Studio 2008 和 Windows Vista

这对我使用 VS2005 有效,但我必须更改 DefaultLocation,我添加了一个“\”来分隔 CommonAppDataFolder。

[CommonAppDataFolder][制造商][产品名称]

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

我遇到过同样的问题。安装项目为用户提供了“仅适用于当前用户”或“适用于所有用户”安装应用程序的选项。因此,数据库文件最终将位于当前用户或所有用户应用程序数据文件夹中。安装程序必须将此信息写入某处,以便应用程序稍后在访问数据库时可以检索它。否则它如何知道要查找哪个应用程序数据文件夹?

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

我得到的第一块拼图 这里:

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 的说明,了解如何将通用应用程序数据文件夹添加到安装项目,并将数据库文件放置在该文件夹中。

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

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

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

  1. 在解决方案资源管理器中右键单击您的安装项目,然后选择“查看 -> 文件系统”。

  2. 右键单击“目标计算机上的文件系统”并选择“添加特殊文件夹 -> 自定义文件夹”。

  3. 将自定义文件夹重命名为“通用应用数据文件夹”。 (这不是将用于结果文件夹使用的名称,而是为了帮助您保持直率。)

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

  5. 奇怪的片刻是在荒谬(但不可否认的)事实上,有一个名为“财产”的文件夹属性。充满狂犬病的婴儿,谁想到了这个狗屎?

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

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

我不确定这对您的情况是否有帮助。

但是如果您将私有部分添加到应用程序的配置文件中

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

如果您要说的是您希望能够安装到机器上的其他文件夹中,那是一个问题。从本质上讲,MS限制了这些内容的全部原因是将恶意代码远离用户不了解其安装的机器。

因此,如果您需要另一个目录,这将不起作用。该修复程序的作用是允许您在应用程序中指定搜索文件的位置......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top