我们创建了一个安装程序(Nullsoft Install System v2.46),用于安装应用程序, plus 一些(嵌套)数据目录,其中包括(文本)数据文件,这些文件可以从中读取/写入已安装的应用程序。
WinXP上的一切正常:加载应用程序,可以从嵌套在安装目录下的数据目录中读取/写入文件。
但是,在Win7 / 64上安装,作为安装的一部分创建的数据目录是只读的。因此,应用程序加载数据文件,但无法覆盖它们(因为它们位于安装目录下的只读数据目录中)。
是的,因为这是Win7-64bit,数据目录恰好位于:
C:\Program Files (x86)\MyApp\MyDataDir0
据我所知,Win7的安装策略比以前的WinOS更严格(出于安全考虑)。
问题:我们应该使用什么机制来确保这些数据目录是可读/写的,并且在安装过程中它们中的(文本)数据文件也是可读/写的?
这些数据文件不是特定于用户的,它们意味着程序运行所需的数据。 (没有它们,程序就没用了。)从逻辑上讲,它们是“程序系统”文件,虽然我们可以理解它们代表程序使用的“可扩展数据集”(因此它们必须是读/写)。
为了简单和一致,我们宁愿用安装程序解决这个问题,而不是从程序中更改目录/文件权限。我们希望这些数据存在于安装应用程序的位置,而不是某些C:/Users/Default/
。或C:/ProgramData/MyApp/.
目录。
我们对数据dirs-under-app-install-dir对Win7策略的“读/写”兴趣是什么? (我们不应该在那里安装它们吗?)
答案 0 :(得分:2)
如果您依赖写入%ProgramFiles%,您的程序基本上在每个版本的WinNT上都被破坏,您只是无法以非管理员身份进行测试!
如果您想允许每个人写入文件或文件夹的访问权限,请使用Access Control plugin。这样做可以放弃一些安全性。要降低风险,请确保数据文件存储在子目录(%ProgramFiles%\MyApp\Data
或类似内容)中,并且不授予普通用户对.exe或.dll文件夹的写访问权。
您真正应该做的是在程序首次运行时将文件从%ProgramFiles%复制到%AppData%,这样每个用户都可以获得自己的设置并且没有安全问题。
答案 1 :(得分:1)
实际上,您的应用程序无法在用户不是管理员的Windows XP下运行。 Windows 7 / Vista中Program Files目录的默认权限与Windows XP中的相同。
根据您的描述,这些文件不是程序文件,而是程序数据文件,因此最好将它们存储在ProgramData
目录中。要检索其位置,请使用CSIDL_COMMON_APPDATA
作为参数调用SHGetFolderPath
函数。但是,即使在这种情况下,您也可能需要编辑应用程序文件夹权限以允许任何用户书写。
如果您仍想将文件存储在Program Files中,那么您唯一的选择就是在安装过程中编辑数据文件夹的权限。