UnauthorizedAccessException:对路径的访问被拒绝

时间:2018-06-26 07:02:15

标签: c# .net wix windows-installer installer

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

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

这三个部分都可以很好地配合使用,但是当我尝试将其安装在“ 程序文件”或“ 程序文件(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.

对此的任何投入都会很亲切。

预先感谢您的帮助!

5 个答案:

答案 0 :(得分:1)

只有 InstallExecuteSequence InstallInitialize 之间的 InstallFinalize 子部分升高。除非已从已经提升的 cmd.exe 提示符下启动了整个MSI,否则其余的设置都具有正常的用户权限。

MSI中的标准操作运行较高,但是对于自定义操作,仅在没有权限的情况下运行的延迟模式自定义操作在具有较高权限的系统上下文中运行。它们只能存在于InstallInitialize和InstallFinalize之间。

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

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

请提供一些评论,以便我们对您的工作有所了解,我将看看是否可以找到有关延迟模式自定义操作的良好链接。


一些相关链接

答案 1 :(得分:0)

如果问题实际上是由在非管理模式下运行的小型可执行文件引起的,则可以通过在应用程序清单(app.manifest)中将requestedExecutionLevel设置为requireAdministrator来解决此问题。

Here是一个分步示例。

安装程序启动可执行文件时,将显示UAC提示,并且用户可以输入有效的管理员凭据来评估进程的特权。

答案 2 :(得分:0)

“程序文件”文件夹中的文件不应被修改,如果您的配置文件对于所有安装而言都不是静态的,则应将它们放在其他文件夹中,例如AppData

答案 3 :(得分:0)

冒着重复其他答案的风险:

  1. 您必须处于运行状态,才能在Program Files文件夹中修改或创建数据。这没有什么新鲜的,但是显然这意味着您的程序没有被提升。仅当标记为延迟时,它才会运行。

  2. 在您的第3步中,通常无需使用bat文件来清理您的残留程序。您可以从Binary表中将其作为自定义操作运行,因此Windows将在您执行后将其流式传输,运行并清理。请注意,如果您将该可执行文件作为文件安装并删除了,则应假定在修复或升级时希望原始MSI重新安装它。作为测试,请删除该文件,然后修复产品并查看文件是否已还原。

作为健全性检查,您应该发布与自定义操作及其调用位置有关的WiX源。通常,问题不在于代码,而在于它所运行的环境。

答案 4 :(得分:0)

为wix正在尝试安装的项目打开项目属性

进入安全性

并将安全设置设置为

enter image description here