VS2008安装项目:共享(按所有用户)应用程序数据文件?
其他类人猿,睡莲叶和桨轮!
我正在使用VS 2008在C#/。NET / WPF中开发Windows桌面应用程序。在Vista和XP计算机上安装和运行该应用程序是必需的。我正在使用安装程序/ Windows Installer项目来安装应用程序。
我的应用程序需要对SQLCE数据库文件(.sdf)以及与我正在使用的第三方控件相关的其他一些数据库类型文件的读/修改/写访问权限。这些文件应在PC上的所有用户/登录名之间共享,而无需成为管理员即可。当然,这意味着文件不能进入程序自己的安装目录(就像在Vista到来之前通常所做的那样,是的,是的!)。
我曾期望解决方案很简单。 Vista和XP都具有用于此目的的共享应用程序数据文件夹。 (在Vista中为" \ ProgramData",在XP中为" \ Documents and Settings \ All Users \ Application Data"。)存在.NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData)调用,用于查找给定PC上这些文件夹的路径,是的, 是的!
但是我不知道如何将共享应用程序数据文件夹指定为安装项目中的目标。
安装程序项目提供了一个"公用文件"文件夹,但该文件夹专用于共享程序组件(不是数据文件),通常位于" \ Program Files"下,并且具有与" \ Program Files"中其他所有文件相同的安全性限制,是的是的!
安装项目提供了"用户的应用程序数据"文件夹,但这是每个用户的文件夹,这正是我要避免的,是的,是的!
是否可以通过VS 2008安装项目以健壮的,跨Windows版本的方式将文件添加到shared-app-data文件夹中?谁能告诉我如何?
解决方案
回答
我已经通过其他渠道了解了我的问题的答案,是的,是的!可悲的是,这并没有解决我的问题!是什么让我–定影液上层?是的是的!
要将内容放入VS2008安装程序项目的"公共应用程序数据"文件夹的子目录中,请执行以下操作:
- 在解决方案资源管理器中右键单击安装项目,然后选择"查看->文件系统"。
- 右键单击"目标计算机上的文件系统",然后选择"添加特殊文件夹->自定义文件夹"。
- 将自定义文件夹重命名为"公共应用程序数据文件夹"。 (这不是将用于结果文件夹的名称,只是为了使其保持平整。)
- 将文件夹的DefaultLocation属性更改为" [CommonAppDataFolder] [Manufacturer] \ [ProductName]"。请注意与"应用程序文件夹"的DefaultLocation属性的相似之处,包括单反斜杠的用法奇怪。
- 让我们惊讶的是,有一个名为" Property"的文件夹属性,这很可笑(但不可否认)。
- 将文件夹的"属性"属性更改为" COMMONAPPDATAFOLDER"。
放置在"公用应用程序数据"文件夹中的数据文件将被复制到" \ ProgramData \ Manufacturer \ ProductName"(在Vista上)或者" \ Documents and Settings \ All Users \ Application Data \ Manufacturer \ ProductName"(在XP上)。安装程序运行。
现在事实证明,在Vista中,非管理员无法在此处对文件进行修改/写入访问。因此,所有用户都可以读取文件,但是他们也可以在" \ Program Files"中获得文件。那么,我想知道"通用应用程序数据"文件夹的目的是什么?
回答
我不确定这是否对我们有帮助。
但是,如果我们将私有部分添加到应用的配置文件中
我们可以指定其他文件夹来签入应用程序。
如果我们要说的是我们希望能够安装
放到机器上的其他文件夹中,那么就是一个问题。
本质上,MS限制了此内容的全部原因
是为了防止恶意代码脱离用户不知道的计算机
他们正在安装什么。
因此,如果我们需要其他目录,则此方法将无效。
此修复程序的作用是允许我们指定位置
在应用程序中搜索文件...
回答
使用VS2005对我有用,但是我必须更改DefaultLocation,我添加了一个''来分隔CommonAppDataFolder。
[CommonAppDataFolder] [制造商] [ProductName]
不知道这是否是错字,但Lyman确实提到了单个反斜杠的奇怪用法,但这似乎并不正确。
回答
我用这种方法解决了。我将数据库文件(.sdf)保留在与应用程序安装位置相同的文件夹("应用程序文件夹")中。在主项目的属性窗口的安全性选项卡上,我选中了"启用ClickOnce安全性设置"并选择了"这是一个完全信任的应用程序",然后重新构建并运行了安装程序。之后,没有安全问题
我正在使用Visual Studio 2008和Windows Vista
回答
我遇到过同样的问题。安装项目为用户提供了"仅针对当前用户"或者"针对所有用户"安装应用程序的选项。因此,数据库文件最终将存储在当前用户或者"所有用户"应用程序数据文件夹中。必须将这些信息写入某个地方,以便应用程序在访问数据库时可以稍后检索它,否则它将如何知道要查找哪个应用程序数据文件夹?
为避免此问题,我只想将数据库安装在"所有用户/应用程序数据"文件夹中,而不管该应用程序是为一个用户还是为所有用户安装的。我当然知道,两个用户如果不覆盖彼此的数据就无法在同一台计算机上安装该应用程序。但是,这种可能性很小,我不想考虑。
我来到这里的第一个难题:
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占位符。这件作品来自这里。在数据集设计器中,找到数据集的属性,打开"连接"节点并编辑"连接字符串"属性,如下所示:
Data Source=|DataDirectory|\YourDatabase.sdf
然后,我按照上面的Lyman Enders Knowles的说明进行操作,以了解如何将Common Application Data Folder添加到安装项目并将数据库文件放置在该文件夹中。
然后,我从上面遵循了Ove的建议,即我选中了"启用ClickOnce安全设置",然后选择了"这是一个完全信任的应用程序。
之后,该应用程序可以在Vista上很好地部署,并且可以读取和写入数据库文件。
回答
无需选中"启用ClickOnce安全设置"并选择"这是一个完全信任的应用程序",而是可以在安装项目的"安装"部分下使用"自定义操作"来更改应用程序的CommonAppDataDirectory的权限。这是我做的:
- 添加了一个自定义操作来调用正在安装的应用程序(或者,我们可以创建一个单独的程序/ dll并调用该程序/ dll)
- 将参数属性设置为"安装"
- 在Program.cs中修改了Main以检查该arg:
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安全性"会导致用户在应用程序启动时看到不希望的提示。如上所述执行此操作将防止此情况的发生。我希望这可以帮助别人。我知道几天前看到类似的东西可能会受益匪浅!