【问题标题】:Where can I put files such that they can be edited by non-administrators and accessed by all users?我可以将文件放在哪里,以便非管理员可以编辑并供所有用户访问?
【发布时间】:2011-09-01 10:50:35
【问题描述】:

我正在开发一个具有静默更新程序的 Windows 应用程序,因此可执行文件需要能够被覆盖。

该应用程序还加载了一些 .dll

我尝试将可执行文件和 dll 放在应用程序数据文件夹中,但 Visual Studio 给了我一个警告,说明所有用户都无法访问这些文件。

我尝试将可执行文件放在应用程序数据文件夹中,将 dll 放在程序文件文件夹中,但由于无法加载 dll,应用程序崩溃了。

我该如何 A) 删除警告或 B) 以更好的方式组织所有内容?

【问题讨论】:

  • 在 CLR 世界中,这不正是 GAC 适合的吗?我认为 GAC 允许静默安装(以及后续升级)数字签名内容。

标签: c# windows visual-studio dll setup-deployment


【解决方案1】:

系统上没有这样的文件夹。我的一些想法是:

  • 使用 GAC。据我所知,如果您将二进制文件捆绑为数字签名程序集,GAC 将允许静默安装和“升级”。 (这里的安全性是作为程序集 ID 的一部分的公钥所固有的,因此 GAC 中的结果并不重要,只要它已签名,“恶意软件”程序集就不能模拟已签名的程序集)

  • 使用基于 MSI 的安装程序:同样,在初始管理安装后,MSI 安装程序将允许静默安装补丁到现有的数字签名内容。此处的安全性在于管理员首先授予安装权限。可以确认已签名的补丁 MSI 来自同一发布者,因此 MSI 不需要重新提示许可)。

  • 将主二进制文件安装到具有 UAC 提升的共享位置。将修补程序二进制文件存储在每个用户的文件夹中。这可以防止非管理员用户覆盖彼此的文件。可能存在一些冗余,但那又怎样。

  • 最后(也是最起码的),创建您自己的文件夹,几乎可以在任何您想要的地方。在创建时,从 Windows 安全的角度来看,该软件是新文件夹的所有者,并且,作为所有者,您具有调整新文件夹的 ACL 的隐式权限。因此,您的初始安装过程(以用户管理员身份运行)可以(在可以成功创建的文件夹上)调整文件夹的 ACL 以赋予“用户”组可继承的 R/W 访问权限。随后任何用户在文件夹中创建的所有文件都将可供所有用户读写(访客除外(您真的不想授予访客用户对任何内容的写入权限)。

最后一个选项是一个安全问题,因为普通用户不应该能够影响其他用户的执行环境。 “用户 R/W 访问”是指普通用户可以安装木马或以其他方式篡改系统上的其他用户数据,这实质上已将所有用户提升为临时管理员。

  • 更安全的角度是,在初始安装期间,将更新代理安装为服务。然后,在每个用户帐户上运行的非提升软件将使用某种 IPC 连接到服务,该服务以 SYSTEM 身份运行,将有权更新用户帐户无权访问的位置的文件。

这是一个相当复杂的解决方案,本质上是重新发明轮子 - MSI 安装程序使用服务代理组件来执行升级,而无需 UAC 提示。

【讨论】:

    【解决方案2】:

    可执行文件和 Dll 应始终放在 Program Files 中。更新程序应通过 UAC 处理特权提升。

    【讨论】:

    • 通过 UAC 处理更新会破坏使静默更新程序静默的意义。
    • @Drew,你意识到你想为安全问题打开大门,对吧?
    • @macias 是的,但是有人干扰我们的更新过程的可能性很小,所以我认为避免更新的麻烦是值得的。静默更新器是我切换到 Chrome 的重要原因,我认为所有应用程序都应该静默更新。
    • @macias 安全问题?我不确定我是否同意你的看法。
    【解决方案3】:

    Chrome 也有静默更新程序,整个可执行文件保存在用户文件夹中。 就我而言,在 Windows 7 上,它保存在:C:\Users\my account name\AppData\Local\Google

    您还应该查看Environment.SpecialFolder 枚举。

    【讨论】:

    • Chrome .exe 也为我存储在那里。不过,我在那个文件夹中看不到任何 .dll,您知道 Google 将 dll 放在哪里以及它如何允许 .exe 看到它们吗? CommonApplicationData 和 ProgramFiles 特殊文件夹看起来很有希望,但我不知道如何让 .exe 看到 .dll,如果它们在这些文件夹中并且 .exe 在 ApplicationData 中
    • 我相信 DLL 在安装 App 时总是在文件夹中查找。而且我从未听说过限制,这会在用户文件夹中破坏此查找。
    • 我所有的 chrome 文件都在:C:\Program Files\Google\Chrome\Application 以及 DLL 的子文件夹中。
    • Chrome 将其 DLL 放在以版本命名的子文件夹中,例如11.0.696.68
    【解决方案4】:

    如果你想像 Chrome 那样把它们放在

    Environment.GetFolderPath(Environment.SpecialFolder.System)
    

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2015-03-07
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多