【问题标题】:Cannot create files in C:\ProgramData\ even after granting Users group full permission即使授予用户组完全权限后,也无法在 C:\ProgramData\ 中创建文件
【发布时间】:2015-01-04 02:27:31
【问题描述】:

我们有一个应用程序尝试写入 C:\ProgramData\ 文件夹中的 Access 数据库 (.mdb)。在启用了 UAC 的计算机上,我们发现访问数据库失败,因为它似乎无法创建锁定文件。似乎默认情况下(可能是由于 UAC)用户(包括管理员)默认情况下没有写入应用程序文件夹的权限。

我们认为授予“用户”组对此文件夹的完全权限可以解决问题,但没有任何区别。即使授予“每个人”完全控制权仍然无济于事。解决问题的唯一方法似乎是将数据库移动到另一个文件夹(例如 C:\applicationname),这不是最佳做法,或者通过更改快捷方式以管理员权限运行应用程序。

我们怎样才能让普通用户可以在 C:\ProgramData\ 文件夹中写入(和创建文件)?还是我们滥用了这个文件夹?我的印象是放置共享程序数据(适用于所有用户)的正确位置,许多其他应用程序似乎已将它们的数据放在我的计算机上。

更新:

我发现数据库的克隆副本已放入以下文件夹: C:\Users\\AppData\Local\VirtualStore\ProgramData\

如果我删除此文件夹,应用程序将正常运行。为什么要创建这个文件夹?我能以某种方式阻止这种情况吗?可能是因为安装程序没有给 C:\ProgramData\ 文件夹中的 Users 组足够的权限?

【问题讨论】:

  • 我无法重现您的问题。我使用我的“管理员”帐户创建了文件夹“C:\ProgramData\myApp\”,并且默认权限“用户”具有只读访问权限。但是,一旦我授予他们对文件夹的“修改”权限,他们就可以打开数据库并创建锁定文件。
  • 我也无法在我自己的机器上重现它,但我可以在两台不同的测试机器和客户的计算机上重现它。我不确定计算机之间有什么区别,因为文件夹权限似乎与我相同。

标签: windows ms-access permissions uac


【解决方案1】:

可能是因为安装程序没有给 C:\ProgramData\ 文件夹中的 Users 组足够的权限?

实际上,安装程序更有可能没有足够的权限直接处理“C:\ProgramData\”。 (我认为这个场景听起来很熟悉......)

当 Microsoft 推出 UAC 时,他们需要一种方法让旧应用程序至少可以继续工作一段时间。他们想出的是“文件和注册表虚拟化”,尝试访问(现在)verboten系统文件夹或注册表条目的旧应用程序将被重定向到他们自己的用户特定的“虚拟化”副本那些资源。正如UAC 上的维基百科文章所描述的那样:

假设用户将以管理员权限运行的应用程序在早期版本的 Windows 中从受限用户帐户运行时遇到问题,通常是因为它们试图写入机器范围或系统目录(例如 程序文件)或注册表项(尤其是 HKLM)。[4] UAC 尝试使用文件和注册表虚拟化来缓解这种情况,它将写入(和后续读取)重定向到用户配置文件中的每个用户位置。例如,如果应用程序尝试向用户没有写入权限的目录(例如“C:\Program Files\appname\settings.ini”)写入,则写入将被重定向到“C:\Users\username” \AppData\Local\VirtualStore\Program Files\appname\settings.ini”。重定向功能仅适用于非提升的 32 位应用程序,并且仅当它们不包含请求特定权限的清单时。[13]

如果您的安装程序请求“以管理员身份运行”权限,那么您应该能够避免此问题。

【讨论】:

  • 因此,如果安装程序授予 C:\programData\appname 文件夹用户写入权限,是否会阻止在 VirtualStore 中创建“克隆”副本? (从而解决问题?)
  • 如果安装程序以提升的权限运行,则应该这样做,因为安装程序将创建一个 real "appname\" 文件夹而不是虚拟文件夹,然后应用足够的权限因此其他用户可以对一个“真实”文件夹进行读/写访问。
  • 您的编辑绝对正确吗?安装程序怎么可能没有权限?如果它没有以管理员身份运行,它将无法安装该应用程序。还是我误会了?
  • 这将取决于安装程序具体在做什么。大多数“普通”安装程序需要以提升的权限运行(因此会触发 UAC 提示,即使是从属于“管理员”组成员的帐户运行),但在您的特定情况下,它可能只是以正常运行启动安装程序的用户的权限。
  • 安装程序以管理员用户身份运行。奇怪的是,我现在无法重现这个问题,所以我仍然很困惑到底是什么原因造成的。如果我现在尝试重现它,只需在 VirtualStore 文件夹中创建数据库锁定文件,应用程序就可以正常工作。
【解决方案2】:

我知道这已经过时了,现在可能无法帮助 NickG..

但也许对于下一个人,这个:

  1. 左键单击文件夹
  2. 选择属性。
  3. 单击“安全”选项卡。
  4. 点击高级。
  5. 如果禁用,请单击“启用继承”。
  6. 单击“替换所有子对象...”复选框
  7. 点击确定。

Source

似乎是一个类似的问题,并且为他解决了这个问题。

【讨论】:

  • 感谢您的回复:)
猜你喜欢
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2020-01-04
  • 1970-01-01
  • 2021-10-31
  • 2021-02-06
相关资源
最近更新 更多