C++ MSI 包管理权限

C++ MSI Package Administative Privileges

本文关键字:管理 权限 MSI 包管理 C++      更新时间:2023-10-16

这是我遇到的问题,

我有一个通过将数据写入.txt文件来运行的C++应用程序,我想为该应用程序创建一个 MSI 包。

当我构建并运行我的应用程序时,一切都很好,但是当我运行我的 MSI 安装文件时,创建的应用程序确实被授予了正确的权限来运行。

我找不到一种方法来允许应用程序写入所需的.txt文件,即使我将它们包含在包中并将它们设置为系统文件。

如果我"以管理员身份运行">

一切都很好,但这并不合理,因为我需要它在"以用户身份运行"时运行。

无论如何,是否可以在安装时提示用户同意具有管理员权限的安装,因此不必在每次启动提示之前手动完成。

任何可以让我的代码再次运行的东西都会很棒,谢谢。

更长的写法 :System.UnauthorizedAccessException 在程序文件下运行.exe时(除了下面列出的选项之外还有其他几个选项(。

每用户文件夹

:我认为您应该将有问题的文件安装到每用户文件夹(用户可写 - 例如My Documents(,或作为模板安装到每计算机文件夹(普通用户不可写 - 例如%ProgramFiles%(,然后让您的应用程序将模板从每台计算机位置复制到当前用户的My Documents文件夹 - 例如。然后你写入那里的文件 - 普通用户将具有写入访问权限。我想你也可以写到为用户设置的网络共享。

提升:可以要求应用程序提升运行(链接可能已过时 - 对于 .NET 来说略有不同(,但对于像写入文本文件这样简单的事情来说,这是一种可怕的方法。我永远不会要求这样的提升。提升的权限是普遍存在的,您不希望您的应用程序使用城市的密钥运行 - 您成为黑客目标,工具中的错误变得武装和危险。

ACL 修改:还可以将文本文件安装到每台计算机的位置,并对其应用 ACL 权限,以便普通用户即使没有提升的权限也可以写入它们。这里有一些关于如何执行此操作的信息(要点 2(。这种方法在当今时代是不受欢迎的,但它会奏效。请注意,您的 ACL 权限不应太严格,以防您写入新文件,请在写入操作期间删除旧文件并将新文件重命名为旧名称 - 除了文件写入之外,您还需要创建文件显然 - NTFS 中有非常细粒度的控制。 我认为GenericWrite应该做这个伎俩。


一些链接(松散连接,添加以便于检索(:

  • 从管理员配置文件在当前用户配置文件上创建文件夹和文件
  • 为什么在使用 MSI 时将文件部署限制为用户配置文件或 HKCU 是个好主意?
  • 在用户文件夹中创建一个 .config 文件夹

在权限方面,应用程序的安装和应用程序的运行之间根本没有任何联系。换句话说,在向要安装的应用授予提升权限的 MSI 安装中,你无法执行任何操作。如果有限的用户可以创建一个 MSI 安装程序,然后安装一个提升运行的应用程序,那将是一个巨大的安全漏洞。

所以这个问题实际上与Windows安装程序无关 - 它是关于你要求用户是受限用户还是提升的用户。如果可以接受用户必须具有特权,则向应用提供提升清单。如果受限用户将使用它,则对文件或注册表项的所有写入或修改都必须针对受限用户可用的位置。这也意味着应用将无法执行特权操作,例如启动或停止服务。