C# UnauthorizedAccessException:对路径的访问被拒绝

C# UnauthorizedAccessException:对路径的访问被拒绝,c#,.net,wix,windows-installer,installation,C#,.net,Wix,Windows Installer,Installation,作为使用Wix 3.XX的服务安装程序的一部分,我们一直在尝试加密连接字符串。 在访问了Stackoverflow上的几个选项和其他一些社区之后,我们选择分三个部分进行操作 在第一部分中安装服务的安装程序 在安装结束时,它调用一个小的可执行文件,该文件选择现有配置的连接位置,加密安装文件夹中的连接字符串并保存该配置 一个.bat文件,用于清除加密的可执行文件(基本上不留下任何痕迹) 这三个部分都能很好地协调工作,但当我尝试使用非提升权限(非管理模式)在“程序文件”或“程序文件(x86)”中安装加

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

  • 在第一部分中安装服务的安装程序
  • 在安装结束时,它调用一个小的可执行文件,该文件选择现有配置的连接位置,加密安装文件夹中的连接字符串并保存该配置
  • 一个
    .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.
    
    System.Configuration.ConfigurationErrorsException
    HResult=0x80131902
    内部异常1:
    未经授权的访问例外:
    对路径“C:\Program Files(x86)\\5tkbxj1v.tmp”的访问被拒绝。
    
    对此的任何投入都将是慷慨的


    提前感谢您的帮助

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

    这是一个循序渐进的例子


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

    不应修改Program Files文件夹中的文件,如果您的配置文件不能在所有安装中都是静态的,您应该将它们放在其他文件夹中,如只有
    InstallExecuteSequence
    之间的
    InstallInitialize
    InstallFinalize
    的子部分运行。安装程序的其余部分具有正常的用户权限,除非整个MSI是从已提升的
    cmd.exe
    提示符启动的

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

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

    您正在从GUI中的用户检索连接字符串吗?您应该能够在即时模式下使用DLL自定义操作对从用户检索到的数据进行加密,然后使用延迟模式自定义操作写入配置文件-当您拥有提升的权限时。一点也不琐碎,但有可能

    请提供一些评论,以便我们了解更多关于您正在做的事情,我将看看是否可以找到延迟模式自定义操作的良好链接


    一些相关链接


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

      • 您必须运行提升才能修改或创建Program Files文件夹中的数据。这并不是什么新鲜事,但显然这意味着你的程序没有提升。仅当标记为延迟时,它才会提升运行

      • 在步骤3中,通常不需要使用bat文件来清理剩余程序。您可以从二进制表中将其作为自定义操作运行,这样Windows将流式输出、运行并在您完成后进行清理。请注意,如果您将该可执行文件安装为文件并将其删除,则应假定修复或升级将需要原始MSI重新安装它。作为测试,请删除该文件,然后修复该产品,并查看该文件是否已还原


      • 作为一项健全性检查,您应该发布与自定义操作相关的WiX源代码以及调用它的位置。通常情况下,问题不在于代码,而在于它运行的环境

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

        转到安全性

        并将安全设置设置为


        如果安装程序在非管理模式下运行,那么它在第一步就无法将二进制文件安装到程序文件中……是的,我完全知道这一点。你能帮我理解如何在wix的管理模式下运行它吗?