C++ Windows 8:应用程序无法写入C:\ProgramData\

C++ Windows 8:应用程序无法写入C:\ProgramData\,c++,windows,winapi,windows-8,C++,Windows,Winapi,Windows 8,我正在Windows 8上移植我的应用程序。程序使用路径 C:\ProgramData\MyProgramName\ 用于存储备份。 它在Windows7上运行良好,但当我在Windows8上运行它时,它被“拒绝访问” 存储程序备份(与任何特定用户无关)的正确方式和位置是什么?C:\ProgramData具有防止标准用户在其中写入的安全设置。这在Windows8中并不新鲜,Windows7也是如此,Vista上的等效文件夹也以这种方式进行保护。可能您的Windows 7环境已禁用UAC,或者您已

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

C:\ProgramData\MyProgramName\

用于存储备份。 它在Windows7上运行良好,但当我在Windows8上运行它时,它被“拒绝访问”


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

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

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


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

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

要获取公用应用程序文件夹的路径,可以使用CSIDL_common_APPDATA作为文件夹id调用该函数。如果不需要支持Windows Vista之前的任何内容,则可以调用该函数,并将FOLDERID_ProgramData作为已知文件夹id传递


啊!!我不知道普通用户无法写入公共应用程序文件夹。幸运的是,似乎有一个推荐的解决方案。请参阅MSDN上的这篇文章,其中说明了以下内容“如果应用程序要求普通用户具有对CSIDL_COMMON_APPDATA的特定于应用程序的子目录的写入权限,则应用程序必须在应用程序安装期间明确修改该子目录上的安全性。修改后的安全性必须记录在供应商调查问卷中。“/p>桌面的本地C++。@ HuffZFRP问题明确地要求与用户帐户无关的应用程序范围的存储位置。@像Windows那样的多用户操作系统上的HuffZFrp,您不能将机器范围的存储与安全性分开考虑。@ DavidHeffernan -当然不是。正如人们不能从一个单一的用户土地过程考虑整个内存空间。没有Ring0访问,没有汤给你!至少从Windows 2000开始,这是一个坏主意(TM)。
CSIDL\u COMMON\u APPDATA
FOLDERID\u programmadata
通常扩展到
C:\programmadata
。那么,你如何处理安全问题呢?@DavidHeffernan:“安全”不是一个可以单独使用的名词。针对什么对手保护哪些信息?@MSalters
FOLDERID\u programmadata
是安全的,以防止标准用户写入。这就是问题所在。这个答案并没有解决这个问题。@DavidHeffernan:是的,但它也没有做出任何其他假设。您的答案假设一个安全模型,其中单个共享可写文件夹是合适的。情况可能并非如此,例如,另一个模型在“ProgramData\ApplicationName”@mAlters下面有每个用户的子文件夹。我的回答没有这样的假设。它指出,必须采取一些措施来处理配股问题,并提出了两个共同的选择。这个答案忽略了权利,这是问题的关键。在ProgramData下,每个用户的权利都是非常奇怪的。这就像是在系统背后重新创建用户配置文件。