我正在使用VS 2008在C#/ .NET / WPF中开发Windows桌面应用程序。该应用程序需要在Vista和XP计算机上安装和运行。我正在使用Setup / Windows Installer Project安装该应用程序。
我的应用程序需要读取/修改/写入SQLCE数据库文件(.sdf)以及与我正在使用的第三方控件相关的其他数据库类型文件。这些文件应该在PC上的所有用户/登录之间共享,其中任何一个都不需要是管理员。当然,这意味着文件不能进入程序自己的安装目录(因为在Vista到来之前通常会这样做,是的,是的!)。
我原本以为解决方案很简单。 Vista和XP都有用于此目的的共享应用程序数据文件夹。(Vista中的“\ ProgramData”,XP中的“\ Documents and Settings \ All Users \ Application Data”。).NET存在Environment.GetFolderPath(SpecialFolder.CommonApplicationData)调用以查找给定PC上这些文件夹的路径,是的,是的!
但我无法弄清楚如何在安装项目中将shared-application-data文件夹指定为目标。
安装项目提供了一个“公共文件”文件夹,但是它用于共享程序组件(不是数据文件),通常位于“\ Program Files”下,并且在“\ Program Files”中具有相同的安全限制“是,是的,是的!
安装项目提供了一个“用户的应用程序数据”文件夹,但这是一个每用户文件夹,这正是我想要避免的,是的,是的!
是否可以从VS 2008安装项目以强大的跨Windows版本方式将文件添加到shared-app-data文件夹?谁能告诉我怎么样?
答案 0 :(得分:20)
我通过其他来源了解了我的问题的答案,是的,是的!可悲的是,它没有解决我的问题!是什么让我 - 一个固定鞋面?是的,是的!
要将东西放在VS2008安装项目的Common Application Data文件夹的子目录中,以下是您的操作:
在解决方案资源管理器中右键单击您的安装项目,然后选择“查看 - >文件系统”。
右键单击“目标计算机上的文件系统”,然后选择“添加特殊文件夹 - >自定义文件夹”。
将自定义文件夹重命名为“Common Application Data Folder”。 (这不是将用于生成的文件夹的名称,它只是为了帮助您保持正确。)
将文件夹的DefaultLocation属性更改为“[CommonAppDataFolder] [制造商] \ [产品名称]”。请注意与Application Folder的DefaultLocation属性的相似性,包括奇怪使用单个反斜杠。
对于一个名为“Property”的文件夹属性这个荒谬(但无可否认)的事实惊叹不已。
将文件夹的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文件夹的重点是什么?
答案 1 :(得分:10)
不是选中“启用ClickOnce安全设置”并选择“这是一个完全信任的应用程序”,而是可以在安装项目的“安装”部分下使用自定义操作更改应用程序的CommonAppDataDirectory的权限。这是我做的:
static void Main(string[] args)
{
if (args != null && args.Length > 0 && args[0] == "Install")
{
ApplicationData.SetPermissions();
}
else
{
// Execute app "normally"
}
}
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安全性”可能会导致用户在应用启动时看到不需要的提示。如上所述这样做可以防止这种情况发生。我希望这可以帮助别人。我知道几天前我能从这样的事情中受益匪浅!
答案 2 :(得分:6)
我这样解决了。我将数据库文件(.sdf)保存在与安装应用程序的位置相同的文件夹中(应用程序文件夹)。在主项目的属性窗口的安全选项卡上,我选中了“启用ClickOnce安全设置”并选择“这是一个完全信任的应用程序”,重建并运行设置。之后没有安全问题
我正在使用Visual Studio 2008和Windows Vista
答案 3 :(得分:1)
这对我使用VS2005很有用,但我不得不更改DefaultLocation,我添加了一个'\'来分隔CommonAppDataFolder。
[COMMONAPPDATAFOLDER] [生产] [ProductName]的
不知道这是不是一个错字,但Lyman确实提到了单个反斜杠的奇怪用法,但这似乎不正确。
答案 4 :(得分:1)
我有同样的问题。安装项目为用户提供了“仅针对当前用户”或“针对所有用户”安装应用程序的选项:因此,数据库文件将最终位于当前用户或所有用户应用程序数据文件夹中。必须在某处写入此信息,以便应用程序可以在以后检索它时,访问数据库。如何知道要查看哪个应用程序数据文件夹?
为了避免此问题,我只想在All Users / Application Data文件夹中安装数据库,无论该应用程序是为一个用户还是为所有用户安装的。当然,我意识到两个用户无法在同一台计算机上安装应用程序而不会覆盖彼此的数据。但是,这是一个遥远的可能性,我不想考虑它。
我得到的第一部拼图here:
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占位符。这篇文章来自here。在DataSet设计器中,找到DataSet的属性,打开Connection节点并编辑ConnectionString属性,如下所示:
Data Source=|DataDirectory|\YourDatabase.sdf
然后我按照上面的Lyman Enders Knowles的说明,了解如何将Common Application Data Folder添加到安装项目中,并将数据库文件放在该文件夹中。
然后我按照Ove的建议,即检查了“启用ClickOnce安全设置”并选择“这是一个完全信任的应用程序。”
之后,应用程序在Vista上部署得很好,数据库文件可以读取和写入。
答案 5 :(得分:1)
我喜欢以下概念,其中一些内容来自上面
在解决方案资源管理器中右键单击您的安装项目,然后选择“查看 - >文件系统”。
右键单击“目标计算机上的文件系统”,然后选择“添加特殊文件夹 - >自定义文件夹”。
将自定义文件夹重命名为“Common Application Data Folder”。 (这不是将用于生成的文件夹的名称,它只是为了帮助您保持正确。)
将文件夹的DefaultLocation属性更改为“[CommonAppDataFolder] [制造商] [ProductName]”。请注意与Application Folder的DefaultLocation属性的相似性,包括奇怪使用单个反斜杠。
对于一个名为“Property”的文件夹属性这个荒谬(但无可否认)的事实惊叹不已。充满狂犬病的婴儿,谁想出这个狗屎?
将文件夹的Property属性更改为“COMMONAPPDATAFOLDER”。
string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
答案 6 :(得分:0)
我不确定这对你的情况是否有帮助。
但是如果您在应用的配置文件中添加了一个私有部分
您可以在应用中指定要检查的额外文件夹。
如果您要说的是您希望能够安装 进入机器上的其他文件夹,那就是一个问题。 基本上是MS限制这些东西的全部原因 是将恶意代码保留在用户不知道的机器上 他们正在安装什么。
因此,如果您需要其他目录,这将无效。 此修复程序的作用是允许您指定位置 在你的应用程序中搜索文件......