c# - 未经授权的访问异常 : Access to the path is denied

标签 c# .net wix windows-installer installation

作为使用 Wix 3.XX 的服务安装程序的一部分,我们一直在尝试加密连接字符串。 在访问了 Stackoverflow 和其他一些社区的几个选项后,我们选择分三部分进行。

  1. 在第一部分安装服务的安装程序
  2. 在安装结束时,它会调用小型可执行文件来选择现有配置的连接位置,加密安装文件夹中的连接字符串并保存该配置。
  3. 一个 .bat 文件,用于清除加密的可执行文件(基本上不留下任何痕迹)

这三个部分配合得很好,但是当我尝试将其安装在“Program Files”或“Program Files (x86)”时加密可执行文件失败"使用非提升权限(非管理员模式)。

调试给我留下了痕迹,这意味着安装程序未经授权可以进行任何此类进程。

这是实现它的代码片段:

1. var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configPath };
2. var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
3. var section = configuration.GetSection(sectionToEncrypt);
4. section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
5. section.SectionInformation.ForceSave = true;
6. configuration.Save(ConfigurationSaveMode.Modified);

到达第 6 行时返回错误:

System.Configuration.ConfigurationErrorsException
HResult=0x80131902
Inner Exception 1: 
UnauthorizedAccessException: 
Access to the path 'C:\Program Files (x86)\<AppDirectory>\5tkbxj1v.tmp' is denied.

对此的任何输入都将是亲切的。

在此先感谢您的帮助!

最佳答案

Only the sub-section of the InstallExecuteSequence between InstallInitialize and InstallFinalize runs elevated. The rest of the setup has normal user rights, unless the whole MSI has been launched from an already elevated cmd.exe prompt.

MSI 中的标准操作运行提升,但关于自定义操作只有延迟模式自定义操作在没有模拟的情况下在系统上下文中以提升的权限运行。它们只能存在于 InstallInitialize 和 InstallFinalize 之间。

在 InstallFinalize 之后插入即时模式自定义操作是一个非常常见的错误,试图在“特权位置”“调整”系统。这在安全环境中或在没有完全管理员权限的情况下运行安装程序时总是会失败。即使您将相关文件的 ACL 设置为标准用户可写,在企业部署期间它也往往会因几个非常技术性的原因而失败。

您是否在 GUI 中从用户处检索连接字符串?您应该能够在立即模式下使用 DLL 自定义操作加密从用户检索的数据,然后使用延迟模式自定义操作写入配置文件 - 当您具有提升的权限时。一点也不微不足道,但有可能。

请提供一些评论,以便我们更多地了解您在做什么,我会看看是否可以为延迟模式自定义操作找到一个好的链接。


一些相关链接:

关于c# - 未经授权的访问异常 : Access to the path is denied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51036732/

相关文章:

windows - 运行批处理文件,在卸载时使用 Wix 安排任务

wix - 复制文件太晚了

c# - WIx "Remember property pattern"不允许属性在自定义操作中可用

c# - Xamarin iOS 在 UIWebView 中加载内容

c# - 自定义配置部分 : CallbackValidator called with empty string

.net - DataGridView垂直滚动条无法正确更新(Forms错误?)

c# - 如何在具有多个客户端的 TCP 服务器端保留消息发送顺序

.net - 仅当最后一组恰好为 n 个字符长时才匹配正则表达式

c# - 从 .Net System.DateTime 生成 Google Protobuf 时间戳

c# - .net 中的 Powershell 版本兼容性