5

我有一个命令行,我想在安装合并模块(由WiX创建)期间使用以下代码运行。

<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,但谷歌搜索不会返回任何感兴趣的内容。

我该如何解决这个问题?

4

1 回答 1

11

我看到你的代码有很多问题。

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

  2. 如果您使用的 MSI 没有被提升 UI/执行过程的引导程序引导,那么您正在模拟UAC,这可能会在 UAC/提升的情况下失败。setup.exe

  3. 您已经硬编码了一个可能不存在的文件夹路径,system32因为 WINDOWS 不必称为 WINDOWS,或者可能是 32 位或 64 位系统文件夹,具体取决于 OS 平台。

  4. 您忽略了返回码,因此如果失败,您的安装将继续进行。插入并祈祷任何人?

  5. 在安装过程中,你会看到一个又大又难看的黑色控制台窗口,它只会尖叫“哦,这家伙不知道他在做什么”。

  6. 您将绝对不会退出 EXE。

  7. 您可能不知道直接调用 EXE 自定义操作可能会出现的问题。

以下是一些帮助您理解这些担忧的阅读材料:

现在我还要提到您可能正在重新发明轮子,但似乎 WiX 的内置IIS自定义操作并未公开您需要的变体点。真可惜。因此,我建议查看以下功能来修复您的 EXE 调用:

我发现这是一种非常优雅的方式来调用您的 EXE,无需闪烁的DOS框,正确登录到您的 MSI 日志并修复 Microsoft 的许多 EXE 问题。从那里您只需要修复它,以便正确解析正确的 32 位或 64 位 appcmd。我的安装程序仅针对仅 64 位平台的 Server 2008 R2,因此我的代码如下所示:

(此代码增加了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>
于 2012-04-05T12:49:40.393 回答