C++ MSI 包管理权限

C++ MSI Package Administative Privileges

这是我遇到的问题,

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

当我构建 运行 我的应用程序时一切正常,但是当我 运行 我的 MSI 安装文件时,创建的应用程序确实获得了正确的运行权限。

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

如果我 "Run as administrator" 一切都很好,但这不太合理,因为我需要它在 "Running as User" 时运行。

安装时是否有提示用户同意以管理员权限安装,这样就不必在每次启动提示前手动完成。

任何能再次获得我的代码 运行ning 的东西都很棒,谢谢。

更长的 WriteupSystem.UnauthorizedAccessException while running .exe under program files(除了下面列出的选项之外还有其他几个选项)。


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

Elevation:有可能 require the application to run elevated (link might be outdated - for .NET it is slightly different),但对于像这样简单的事情来说,这是一种可怕的方法写入文本文件。我永远不需要这样的提升。提权无处不在,您不希望您的应用程序 运行 拥有城市的钥匙 - 您成为黑客的目标,您的工具中的错误变得武装和危险。

ACL 修改:也可以将文本文件安装到每台计算机的位置并对其应用 ACL 权限,以便它们对于普通用户是可写的,即使他们没有提升的权限。 (要点 2)。这种方法在当今时代不受欢迎,但它会奏效。请注意,您的 ACL 权限不应太紧,以防万一您写入新文件,删除旧文件并将新文件重命名为旧文件在写入操作期间 - 除了文件之外,您还需要创建文件写得很明显 - NTFS 中有非常细粒度的控制。 GenericWrite 应该可以实现我的想法。


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

  • Create folder and file on Current user profile, from Admin Profile
  • Create a .config folder in the user folder

应用程序的安装与应用程序的 运行 关于权限之间没有任何联系。换句话说,在 MSI 安装中,g运行ts 无法提升正在安装的应用程序的权限。如果受限用户可以创建一个 MSI 安装程序,然后安装一个 运行 提升的应用程序,那将是一个巨大的安全漏洞。

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