我在 Windows 8 上移植我的应用程序。程序使用路径
C:\ProgramData\MyProgramName\
用于存储备份。它在 Windows 7 上运行良好,但当我在 Windows 8 上运行它时出现“访问被拒绝”。
存储我的程序备份(与任何特定用户无关)的正确方法和位置是什么?
我看到许多程序将与用户无关的应用程序数据存储在通用应用程序文件夹中。好的,实际上他们所做的是在公共应用程序文件夹中创建一个文件夹来存储他们的数据。
要获取通用应用程序文件夹的路径,您可以使用 CSIDL_COMMON_APPDATA 作为文件夹 id调用SHGetFolderPath函数。如果不需要支持早于 Windows Vista 的任何内容,则可以调用SHGetKnownFolderPath函数,并将 FOLDERID_ProgramData 作为已知文件夹 ID 传递。
啊! 我不知道普通用户无法写入通用应用程序文件夹。幸运的是,似乎有一个推荐的解决方案。请参阅 MSDN 上的这篇文章,数据和设置管理,其中指出“如果应用程序要求普通用户对 CSIDL_COMMON_APPDATA 的应用程序特定子目录具有写访问权限,则应用程序必须在应用程序设置期间显式修改该子目录的安全性。修改后的安全性必须记录在供应商问卷中。”
C:\ProgramData
具有阻止标准用户在那里写入的安全设置。这在 Windows 8 中并不新鲜,Windows 7 也是如此,Vista 上的等效文件夹也以这种方式保护。也许您的 Windows 7 环境禁用了 UAC,或者您已保护C:\ProgramData
或C:\ProgramData\MyProgramName
允许对标准用户进行写访问。
有几种方法可以使用此文件夹。某些应用程序仅在安装期间在安装程序进程运行提升时写入那里。然后以标准用户身份运行的应用程序本身可以读取,但从不尝试写入。
另一种方法是让安装程序创建一个C:\ProgramData
安全的子文件夹,以允许标准用户或开发人员认为合适的任何用户/组的写访问权限。