wix
  • windows-installer
  • wix3.5
  • wix3
  • 2012-04-05 72 views 3 likes 
    3

    我有一个命令行,我希望在安装合并模块(由WiX创建)期间运行以下代码。WiX CustomAction ExeCommand失败?

    <CustomAction 
        Id='SetWebsiteProtocols' 
        Execute='commit' 
        Return='ignore' 
        Impersonate="yes" 
        FileKey='Web.config' 
        ExeCommand='c:\windows\system32\inetsrv\appcmd.exe set app "Default Web Site/My Website" /enabledProtocols:http,net.tcp,net.pipe' /> 
    
    <InstallExecuteSequence> 
        <Custom Action="SetWebsiteProtocols" After="InstallFiles"/> 
    </InstallExecuteSequence> 
    

    当我在命令行上运行该命令(此时硬编码)它工作正常。但是,在安装期间运行时,它会失败。打开日志记录显示错误代码1721,但Google搜索没有任何意义。

    我该如何解决这个问题?

    +0

    通过与记录* [进程监控](http://en.wikipedia.org/wiki/Process_Monitor)*可能会得到更多信息,如:“15:06:30,2599355 appcmd.exe 924进程退出成功退出状态:-1073740756”。对应于0xC000042C(无符号/十六进制)的-1073740756(有符号/十进制)是* [STATUS_ELEVATION_REQUIRED](http://msdn.microsoft.com/zh-cn/library/cc704588.aspx)*。这可能表示特权提升的问题。 – 2013-06-17 13:46:53

    回答

    10

    我发现你的代码有很多问题。

    1. 如果回滚被策略禁用,您将被安排提交,这将不会被处理。

    2. 你是冒充UAC可以在UAC失效/升高的情况下,如果你的消费MSI不是由setup.exe被提升的UI /执行过程自举。

    3. 您已硬编码到system32文件夹的路径,该路径可能不存在,因为WINDOWS不必称为WINDOWS,或者可能是32位或64位系统文件夹(具体取决于操作系统平台)。

    4. 你忽略返回代码,所以如果失败会安装继续下去。插入并祈祷任何人?

    5. 你将有一个大丑闪烁的黑色控制台窗口,在安装过程中,只是尖叫“哦,这家伙不知道他在做什么。”

    6. 您将绝对不会从EXE中注销。

    7. 你可能不知道的,可以直接调用发生的EXE自定义操作的问题。

    下面是一些阅读,以帮助您了解这些问题:

    现在我还要提到的是你可能重新发明轮子,但似乎维克斯的内置IIS自定义操作不公开,你需要的变化点。这太遗憾了。所以我建议在看下面的功能来修复您的EXE调用:

    我觉得这是呼唤你的EXE无闪烁DOS箱的一个非常优雅的方式,适当的登录到您的MSI日志并修复许多Microsoft的EXE问题。从那里你只需要解决它,所以你正确地解决正确的32位或64位appcmd。我只安装目标服务器2008 R2是一个64位的唯一平台,所以我的代码如下所示:

    (此代码增强东西InstallShield不公开......)

    <CustomAction Id="SetIISAuthCAD" 
           Property="SetIISAuth" 
           Value="&quot;[System64Folder]inetsrv\appcmd.exe&quot; set config &quot;Default Web Site/MyApplication&quot; /section:system.webServer/security/authentication/windowsAuthentication /useAppPoolCredentials:true /commit:MACHINE/WEBROOT/APPHOST " /> 
    <CustomAction Id="SetIISAuth" 
           BinaryKey="WixCA" 
           DllEntry="CAQuietExec64" 
           Execute="deferred" 
           Return="ignore" 
           Impersonate="no" /> 
    <InstallExecuteSequence> 
        <Custom Action="SetIISAuth" 
          Before="InstallFinalize">Not Installed</Custom> 
        <Custom Action="SetIISAuthCAD" 
          Before="SetIISAuth">Not Installed</Custom> 
    </InstallExecuteSequence> 
    
    +0

    感谢您的帮助 - 我同意示例代码不好,只是为了让它工作。感谢您的帮助和评论! :) – Jon 2012-04-05 13:00:51

    +0

    执行Wix自定义操作时,链接器会出现以下错误: ICE77:SetIISAuth是脚本中的自定义操作。它必须在InstallInitialize操作和InstallExecuteSequence表中的InstallFinalize操作之间进行排序。 – ostati 2014-04-08 19:57:56

    +1

    在我的示例中,自定义操作安排在InstallInitialize和InstallFinalize之间。 – 2014-04-08 20:11:22

    相关问题