Wix 使用提升的权限运行批处理文件的自定义操作

Wix 使用提升的权限运行批处理文件的自定义操作,wix,windows-installer,Wix,Windows Installer,我需要在安装期间启动.cmd脚本,该脚本会修改安装目录中的一些文件。 我有以下WiX代码: <Fragment> <Property Id="WINCMD">cmd.exe</Property> <CustomAction Id="ResignManifest" Property="WINCMD" ExeCommand="/C [ToolDir]manifest_resign.cmd"

我需要在安装期间启动.cmd脚本,该脚本会修改安装目录中的一些文件。 我有以下WiX代码:

<Fragment>
    <Property Id="WINCMD">cmd.exe</Property>
    <CustomAction Id="ResignManifest" 
                  Property="WINCMD" ExeCommand="/C [ToolDir]manifest_resign.cmd"
                  Execute="deferred" Impersonate="no" Return="check"/>

    <InstallExecuteSequence>
        <Custom Action="ResignManifest" After="InstallFinalize"/>
    </InstallExecuteSequence>
</Fragment>

命令提示符
问题是在安装过程中,由于访问权限不足,脚本无法进行修改。MyCA指定MSI不应模拟用户上下文(我使用管理员权限启动安装程序),但cmd.exe运行时没有管理员权限


PS。我知道在安装过程中额外启动bat/cmd文件不是一个好的做法,但我必须这样做,以放弃某些Silverlight应用程序的应用程序和部署清单(在安装过程中,用户修改应用程序配置文件,因此清单中此类文件的哈希无效).

在我的回答历史中,我曾经提到过这个问题。诀窍是通过重构Silverlight代码以读取未签名的settings.xml文件来简化问题。这是几年前我让我的开发者为我们编写的一个内部应用程序所做的。服务器端有一个从settings.xml文件读取的设置Web服务。调用Web服务以检索其设置的Silverlight应用程序。这样就不需要自定义操作

见:


我同意你已经知道的。调用批处理文件并放弃MSI设置的文件不是一个好的设计。您是对的,您应该已经在系统上下文中执行了。你确定CMD.exe没有运行吗?我不知道你怎么能确定,因为它没有被MSI记录。我建议至少使用QuietExecCA模式来获取MSI日志中记录的cmd脚本的结果。

我尝试使用QuietExecCA,但出现错误1723:此Windows Installer软件包有问题。无法运行完成此安装所需的DLL。操作辞职清单,条目:WixQuietExec,库:C:\windows\Installer\MSI6BFC.tmp。我对它的含义感到困惑-我在安装后使用WixCA启动应用程序,不明白在这种情况下会出现什么问题…FWIW,QuietExecCA需要一个指向cmd.exe的完全限定路径,并用引号括起来。Oops。。。没有引用是我的脚本启动失败的原因。现在一切都好了——脚本以提升的权限运行,我甚至不需要QuietExecCA。QuietExecCA增加了价值。它可以防止您遇到许多问题,将stderr和stdout记录到MSI日志中,并防止在安装过程中出现不专业的dos提示。