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

Lym*_*les 31 deployment installation desktop projects-and-solutions visual-studio-2008

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

我正在使用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文件夹?谁能告诉我怎么样?

Lym*_*les 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文件夹的重点是什么?

  • vs安装项目不支持MSI规范中的LockPermissions表,切换到另一个工具或编写自定义操作以更改您创建的文件夹的权限. (3认同)

ejw*_*ipp 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安全性"可能会导致用户在应用启动时看到不需要的提示.如上所述这样做可以防止这种情况发生.我希望这可以帮助别人.我知道几天前我能从这样的事情中受益匪浅!

  • 我想,`BuiltinUsersSid`而不是'WorldSid`会更合适.除此之外,您的代码运行正常. (2认同)

小智 6

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

我正在使用Visual Studio 2008和Windows Vista