如何在延迟的自定义操作中 运行 aspnet_regiis.exe 并传递 INSTALLDIR 属性 的值?

How to run aspnet_regiis.exe in a deferred custom action and pass the value of INSTALLDIR property?

我有一个自定义操作 (RunEncryption2),用于通过 aspnet_regiis.exe 加密配置文件。我使用的自定义操作类型是一个 EXE,其路径引用一个目录(初始类型 34),在系统上下文中使用延迟执行(因此最终类型为 3106)。我要加密的文件位于 INSTALLDIR 上,因此我有一个 Set 属性 自定义操作(SetRunEncryption2,类型 51),我在其中设置 RunEncryption2=[INSTALLDIR]。我的两个自定义操作如下所示:

SetRunEncryption2

Property Name: RunEncryption2

Property Value: [INSTALLDIR]

运行加密2

Working Directory: WindowsFolder

File Name & Command line: [WindowsFolder]Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pef "connectionStrings" "[CustomActionData]" -prov "DataProtectionConfigurationProvider"

当安装程序 运行s 时,我没有收到任何错误,但是文件根本没有加密。当我查看日志时,我得到以下信息:

MSI (s) (34:C0) [17:32:11:356]: Executing op: CustomActionSchedule(Action=RunEncryption2,ActionType=3106,Source=C:\WINDOWS\,Target=C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pef "connectionStrings" "" -prov "DataProtectionConfigurationProvider",CustomActionData=C:\Test\)

从日志中我可以看到 CustomActionData 属性 已正确设置,但是它没有作为命令的一部分包含在内。

在这一点上,我必须使命令工作的唯一方法是传递 INSTALLDIR 的硬编码值,否则它似乎不起作用。

我试过:

  1. 不使用 CustomActionData,而是直接将 INSTALLDIR 的值作为命令行的一部分传递。
  2. 使用具有相似结果的 "Path in Property value" 自定义操作。

当我 运行 上面的选项 1 时,我在日志中收到 1722 错误:

MSI (s) (C4:50) [12:49:46:968]: Note: 1: 1722 2: RunEncryption2 3: C:\WINDOWS\ 4: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pef "connectionStrings" "C:\Test\" -prov "DataProtectionConfigurationProvider" 
    Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor. Action RunEncryption2, location: C:\WINDOWS\, command: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pef "connectionStrings" "C:\Test\" -prov "DataProtectionConfigurationProvider"
    MSI (s) (C4:50) [12:49:56:841]: Product: TestEncryption -- Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor. Action RunEncryption2, location: C:\WINDOWS\, command: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pef "connectionStrings" "C:\Test\" -prov "DataProtectionConfigurationProvider"

有谁知道我该怎么做才能正确执行此命令并动态传递 INSTALLDIR 的值?

最终发现问题不在传递属性的自定义操作中,而是在 aspnet_iisreg 期望参数的方式中。

INSTALLDIR 传递带有尾部斜杠的字符串(例如 c:\Test\),而当我对安装路径进行硬编码时,我传递的是 c:\Test

解决方案包括创建另一个自定义操作,删除尾部斜杠并将值存储在新的 属性 中,然后可以将其用作 aspnet_iisreg 的参数。

顺便说一下,正如 Michael Urman 提到的,没有必要使用 CustomActionData。谢谢