对 运行 批处理文件具有提升权限的自定义操作

Custom action with elevated privileges to run batch file

我需要在安装过程中启动.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>

问题是在安装过程中脚本无法进行修改,因为访问权限不足。我的 CA 指定 MSI 不应模拟用户上下文(我使用管理员权限启动安装程序),但 cmd.exe 在没有管理员权限的情况下运行。

PS。我知道在安装过程中另外启动 bat/cmd 文件不是好习惯,但我必须这样做才能为某些 Silverlight 应用程序重新启动应用程序和部署清单(在安装过程中用户修改应用程序配置文件,因此散列清单中的此类文件无效)。

在我的回答历史中的某个地方,我之前已经解决过这个问题。诀窍是通过重构 Silverlight 代码以从未签名的 settings.xml 文件中读取来简化问题。这是几年前我让我的开发人员为我们编写的内部应用程序所做的。服务器端有一个从 settings.xml 文件读取的设置网络服务。调用网络服务以检索其设置的 Silverlight 应用程序。这消除了自定义操作的需要。

参见:How to do Text file changes in a ZIP file in InstallShield Basic MSI project

Creating and Using Silverlight web.config app settings (Web.config Configuration Applicatioin Settings) or app.config application settings configuration file for Silverlight

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