同胞类人猿和睡莲叶和明轮!

我正在使用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上这些文件夹的路径,是,是的!

但我无法弄清楚如何在安装项目中将shared-application-data文件夹指定为目标。

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

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

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

===============>>#1 票数:20 已采纳

我通过其他来源了解了我的问题的答案,是的,是的! 可悲的是,它没有解决我的问题! 是什么让我 - 一个固定鞋面? 是的是的!

要将东西放在VS2008安装项目的Common Application Data文件夹的子目录中,以下是您的操作:

  1. 在Solution Explorer中右键单击您的安装项目,然后选择“View - > File System”。

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

  3. 将自定义文件夹重命名为“Common Application Data Folder”。 (这不是将用于生成的文件夹的名称,它只是为了帮助您保持正确。)

  4. 将文件夹的DefaultLocation属性更改为“[CommonAppDataFolder] [制造商] \\ [产品名称]”。 请注意与Application Folder的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文件夹的重点是什么?

===============>>#2 票数:10

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

  1. 添加了一个自定义操作来调用正在安装的应用程序(或者您可以创建一个单独的程序/ 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); } }

由于安装程序以管理员权限运行,因此程序将能够更改权限。 我在某处读到“启用ClickOnce安全性”可能会导致用户在应用启动时看到不需要的提示。 如上所述这样做可以防止这种情况发生。 我希望这可以帮助别人。 我知道几天前我能从这样的事情中受益匪浅!

===============>>#3 票数:6

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

我正在使用Visual Studio 2008和Windows Vista

===============>>#4 票数:1

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

  1. 在Solution Explorer中右键单击您的安装项目,然后选择“View - > File System”。

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

  3. 将自定义文件夹重命名为“Common Application Data Folder”。 (这不是将用于生成的文件夹的名称,它只是为了帮助您保持正确。)

  4. 将文件夹的DefaultLocation属性更改为“[CommonAppDataFolder] [制造商] [ProductName]”。 请注意与Application Folder的DefaultLocation属性的相似性,包括奇怪使用单个反斜杠。

  5. 对于一个名为“Property”的文件夹属性这个荒谬(但无可否认)的事实惊叹不已。 充满狂犬病的婴儿,谁想出这个狗屎?

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

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

===============>>#5 票数:1

这对我使用VS2005很有用,但我不得不更改DefaultLocation,我添加了一个'\\'来分隔CommonAppDataFolder。

[COMMONAPPDATAFOLDER] [生产] [ProductName]的

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

===============>>#6 票数:1

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

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

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

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的说明,了解如何将Common Application Data Folder添加到安装项目并将数据库文件放在该文件夹中。

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

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

===============>>#7 票数:0

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

但是,如果您在应用程序的配置文件中添加一个私有部分

您可以指定要在应用中检查的额外文件夹。

如果您要说的是您希望能够安装到机器上的其他文件夹中,那么这就是一个问题。 基本上,MS限制这些东西的全部原因是将恶意代码保留在用户不知道他们正在安装什么的机器上。

因此,如果您需要其他目录,这将无效。 此修复程序的作用是允许您指定应用程序中搜索文件的位置......

  ask by Lyman Enders Knowles translate from so

未解决问题?本站智能推荐:

1回复

使用vs2005安装项目为所有用户安装应用程序

如何使用vs2005安装项目为所有用户安装应用程序,我已将安装项目中的install all users属性安装为true,但安装后没有任何影响。 我的应用程序未加载到其他用户帐户中(显示错误消息)。
1回复

在Visual Studio 2008中创建的安装程序无法正常工作

我有一个问题,就是我有一个在Visual Studio 2008中可以正常运行的桌面应用程序,我创建了一个安装项目,并且我确定我以正确的方式完成了此步骤,就像这里的步骤一样。 在获得安装项目后,它说安装成功,但是当我双击桌面快捷方式时,什么也没有发生。 请注意,我使用的是.NET 2.0
5回复

如何安装/部署/构建我的Visual C#应用程序,以便所有用户都可以使用它?

我在Microsoft Visual C#2008 Express Edition中编写了一个应用程序。 我想安装它的Windows XP计算机有两个用户帐户。 一个是管理员帐户,另一个是主用户帐户,没有管理员权限。 我尝试将应用程序安装为主要用户,并收到错误消息,说我不能,因为我
10回复

Visual Studio安装项目包含文件夹中的所有文件

我们有一个安装项目,目前从不同的Visual Studio项目添加项目输出。 我们想要更改打包系统并使用包含一堆部署文件的文件夹,这些文件已准备好在设置中进行部署。 但这意味着我们需要逐个添加文件,并在有新文件时继续在每个版本上添加它们。 我在这个问题中看到我们无法添加像* .aspx
4回复

Visual Studio 2008安装项目中的HRESULT ='80004005'

当我尝试构建我的安装项目时,我收到以下错误:“验证时发生错误.HRESES ='80004005'”(并且微软赢得了一个清晰的奖项。) 我谷歌发现一大批开发人员遇到了同样的问题。 真的错误应该是:“无法在你的某个项目中找到引用。” 每个人都说(如果在StackOverflow上)如何使
1回复

删除安装程序项目不会使用Visual Studio从文件系统中将其删除

使用Visual Studio 2008-我添加了一个安装项目(来自安装和部署模板),默认情况下调用了Setup1。 然后,我决定不希望这样做,因此我右键单击该项目,然后选择“ 删除” 。 稍后我决定我要再次添加一个安装项目,但是它的默认名称为Setup2,当您查看项目文件夹时,您会看到
2回复

安装项目未找到项目主输出的依赖项

在Visual Studio 2008中,我已将项目的主要输出添加到安装项目,但未找到项目的依赖项。 如果我查看主输出的属性,Dependencies属性显示为(None)。 如果我看起来更深一点,我会发现KeyOutput属性下的Dependencies属性列出了项目依赖项,其中一些属
1回复

VS2008 MFC项目的行为有所不同

在VS 2008中,我有两个基于MFC的托管C ++项目A和B。 对于项目A项目->属性->通用属性,框架和引用->添加新引用会导致面板显示以下四个选项卡:.Net,COM,项目,浏览,最近 对于项目B,项目->属性->通用属性,框架和引用->添加
2回复

VS2008 C ++ lib项目属性设置问题

我使用以下向导在VS2008中创建了C ++静态库项目: -Win32应用 -在“应用程序设置”中,选择“静态库” - 未选中的 “预编译标题” 完成后,我发现在“项目属性->配置属性”下,没有“ C / C ++”部分。 我试图创建另一个静态库项目,并
1回复

VS2008构建同一项目的多个配置

我有三种构建两个客户端和一台服务器并共享许多库的解决方案。 我希望能够将它们组合成一个“主”解决方案,以构建所有必要的项目。 由于各种原因,也许有一个自己的问题,某些共享库静态(仅.lib)链接到一个应用程序,而动态(.lib + .dll)链接到另一个应用程序。 因此,构建实际上需要