我想要在安装合并模块(由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,但谷歌搜索没有返回任何感兴趣的内容。
如何解决此问题?
答案 0 :(得分:10)
我发现您的代码存在许多问题。
您被安排进行提交,如果政策禁用了回滚,则无法处理。
如果您的消费MSI没有被提升UI /执行过程的setup.exe
引导,则您冒充UAC可能在UAC /高架情况下失败。
您已经硬编码了system32
文件夹的路径,该路径可能不存在,因为WINDOWS不必称为WINDOWS,或者可能是32位或64位系统文件夹,具体取决于操作系统平台。
您忽略了返回代码,因此如果此操作失败,您的安装将继续进行。插上并祈祷任何人?
安装过程中你会看到一个丑陋闪烁的黑色控制台窗口,只是尖叫着'哦,这家伙不知道他在做什么。'
您绝对不会退出EXE。
您可能不知道直接调用EXE自定义操作可能出现的问题。
以下是帮助您了解这些问题的一些阅读材料:
现在我还要提到你可能正在重新发明轮子,但似乎WiX的内置IIS自定义动作不会暴露你需要的变化点。真是太遗憾了。因此,我建议您查看以下功能以修复您的EXE呼叫:
我发现这是一种非常优雅的方式,可以在没有闪烁的DOS框的情况下调用您的EXE,正确登录到您的MSI日志并修复许多Microsoft的EXE问题。从那里你只需要修复它,以便正确解析正确的32位或64位appcmd。我的安装程序仅针对Server 2008 R2,这是一个仅64位的平台,因此我的代码如下所示:
(此代码增加了InstallShield未公开的内容......)
<CustomAction Id="SetIISAuthCAD"
Property="SetIISAuth"
Value=""[System64Folder]inetsrv\appcmd.exe" set config "Default Web Site/MyApplication" /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>