【问题标题】:Windows 8: Application is not able write to C:\ProgramData\Windows 8:应用程序无法写入 C:\ProgramData\
【发布时间】:2013-10-06 07:32:11
【问题描述】:

我正在 Windows 8 上移植我的应用程序。程序使用路径

C:\ProgramData\MyProgramName\

用于存储备份。 它在 Windows 7 上运行良好,但是当我在 Windows 8 上运行它时出现“访问被拒绝”。

存储我的程序备份(与任何特定用户无关)的正确方法和位置是什么?

【问题讨论】:

  • 用于桌面的原生 C++。
  • @enhzflep 该问题明确要求独立于用户帐户的应用程序范围的存储位置。
  • @enhzflep 在像 Windows 这样的多用户操作系统上,您不能将机器范围的存储与安全性分开考虑。
  • @DavidHeffernan - 不,当然不是。就像一个人不能考虑从单个用户级进程访问的整个内存空间一样。没有 Ring0 访问权限,没有汤给你!
  • 至少从 Windows 2000 开始,这就是一个坏主意 (TM)。

标签: c++ windows winapi windows-8


【解决方案1】:

C:\ProgramData 具有阻止标准用户在那里写入的安全设置。这在 Windows 8 中并不新鲜,Windows 7 也是如此,Vista 上的等效文件夹也以这种方式保护。也许您的 Windows 7 环境禁用了 UAC,或者您已保护 C:\ProgramDataC:\ProgramData\MyProgramName 以允许标准用户进行写访问。

有几种方法可以使用此文件夹。某些应用程序仅在安装过程中在安装程序运行提升时写入那里。然后以标准用户身份运行的应用程序本身可以读取,但从不尝试写入。

另一种方法是让安装程序创建一个C:\ProgramData 的子文件夹,该文件夹是安全的,允许标准用户或开发人员认为合适的任何用户/组进行写访问。

【讨论】:

    【解决方案2】:

    我看到许多程序将与用户无关的应用程序数据存储在通用应用程序文件夹中。好的,实际上他们所做的就是在公共应用程序文件夹中创建一个文件夹来存储他们的数据。

    要获取通用应用程序文件夹的路径,您可以调用SHGetFolderPath 函数,并将 CSIDL_COMMON_APPDATA 作为文件夹 id。如果不需要支持早于 Windows Vista 的任何内容,则可以调用 SHGetKnownFolderPath 函数,并将 FOLDERID_ProgramData 作为已知文件夹 ID 传递。

    啊!我不知道普通用户无法写入通用应用程序文件夹。幸运的是,似乎有一个推荐的解决方案。请参阅 MSDN 上的这篇文章,Data and Settings Management,其中指出“如果应用程序要求普通用户对 CSIDL_COMMON_APPDATA 的应用程序特定子目录具有写访问权限,则应用程序必须在应用程序设置期间显式修改该子目录的安全性。修改后的安全性必须记录在供应商调查问卷中。”

    【讨论】:

    • CSIDL_COMMON_APPDATAFOLDERID_ProgramData 通常扩展为 C:\ProgramData。那么,您如何处理安全问题?
    • @DavidHeffernan:“安全”不是一个可以单独使用的名词。保护哪些信息免受攻击?
    • @MSalters FOLDERID_ProgramData 被保护以防止标准用户写入。这就是问题所在。这个答案没有解决这个问题。
    • @DavidHeffernan:是的,但它也没有做出任何其他假设。您的答案假设一个安全模型,其中单个可写文件夹是合适的。情况可能并非如此,例如另一个模型在“ProgramData\ApplicationName”下有每个用户的子文件夹
    • @MSalters 我的回答没有做出这样的假设。它指出必须采取一些措施来处理供股问题,并提出了两种常见的选择。这个答案忽略了作为 Q 症结的权利。 ProgramData 下的每个用户会很奇怪。这就像在系统背后重新发明用户配置文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多