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

时间:2017-01-27 23:50:55

标签: installshield

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

SetRunEncryption2

Property Name: RunEncryption2

Property Value: [INSTALLDIR]

RunEncryption2

Working Directory: WindowsFolder

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

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

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. 使用"属性值路径"具有类似结果的自定义操作
  3. 当我运行上面的选项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的值?

1 个答案:

答案 0 :(得分:0)

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

当我硬编码我传递c:\Test\的安装路径时,INSTALLDIR正在传递带有斜杠(例如gr。c:\Test)的字符串。

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

顺便说一下,正如Michael Urman所说,没有必要使用CustomActionData。感谢。