【问题标题】:Non-installing MSI file非安装 MSI 文件
【发布时间】:2013-05-28 13:40:01
【问题描述】:

我目前正在为系统管理员开发一种工具,该工具可用于更新 Windows AD 的所有客户端。它需要与组策略和 SMS 配合才能进行大规模更新。因此,我需要该工具来生成 MSI 文件。

是否可以创建一个安装任何东西而只执行自定义操作(即运行脚本或 exe 文件)的 MSI 文件。

最好的问候雅各布·西蒙·加德

【问题讨论】:

    标签: windows windows-installer system-administration


    【解决方案1】:

    是的,这是可能的。可耻,但是,可能。

    您可以将方形钉插入圆孔中,但您会失去所有预期的好处。

    FWIW,SMS 现在更名为 SCCM,它可以调用 EXE 命令。

    【讨论】:

    • 可耻?这里可耻的是微软的 MSI 系统。与ie相比。 DEB/APT 区分二进制包、源包和虚拟包,并通过存储库概念支持包间依赖关系,MSI 太不灵活了。
    • 是的,可耻。如果您是这样的专家,您可以解释原因。事实上,你甚至不必问这个问题。
    • 如果你告诉我们你的 EXE 是做什么的,我敢打赌,我可以告诉你如何在不违反最佳实践的情况下在 MSI 中做同样的事情。
    【解决方案2】:

    找到了解决我的问题的黑客方法:

    <?xml version='1.0' encoding='windows-1252'?>
    <Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
        <Product
            Name='MVLicense Updater' Id='f8fc0a30-c138-1fe2-838b-0845200c9a66'
            UpgradeCode='00ca86a0-c889-12e2-8f8b-0800200c9a66'
            Language='1033' Version='1.0.0.0' Manufacturer='My Company'>
    
            <Package Id='*' InstallerVersion='200' Compressed='yes' />
    
            <Media Id='1' Cabinet='my.cab' EmbedCab='yes' />
    
            <Directory Id='TARGETDIR' Name='SourceDir'>
                <Directory Id='ProgramFilesFolder'>
                    <Directory Id='INSTALLDIR' Name='My-Updater'>
                        <Component Id='Readme' Guid='68fef080-c87b-34e2-8889-0824200c9a66'>
                            <File Id='ReadmeTXT' Name='readme.txt' Source='readme.txt' Vital='no' />
                            <RemoveFolder Id="INSTALLDIR" On="uninstall" />
                        </Component>
                    </Directory>
                </Directory>
            </Directory>
    
            <Feature Id='Complete' Level="1">
                <ComponentRef Id='Readme' />
            </Feature>
    
            <CustomAction Id="ForceError" Error="1602"/>
            <CustomAction Id="RunMyUpdater" BinaryKey="MyUpdaterExe" ExeCommand="dummy" Return="check"/>
    
            <InstallExecuteSequence>
                <Custom Action='RunMyUpdater' After='InstallInitialize'></Custom>
                <Custom Action="ForceError" After="RunMvlupdate"></Custom>
            </InstallExecuteSequence>
    
            <AdminExecuteSequence>
                <Custom Action='RunMyUpdater' After='InstallInitialize'></Custom>
                <Custom Action="ForceError" After="RunMyUpdate"></Custom>
            </AdminExecuteSequence>
    
            <Binary Id="MyUpdaterExe" SourceFile="dist\myupdater.exe" />
            <UI>
                <Error Id="1602">We have a problem</Error>
            </UI>
        </Product>
    </Wix>
    

    这完成了运行我的可执行文件的工作,该可执行文件基于调用 Internet 服务进行一些配置,然后回滚安装,因为我强制发生错误。

    【讨论】:

    • 这是一个可怕的、可怕的反模式。但是,如果您真的要这样做,您应该使用 Quiet Execute Custom Action 包装您的 EXE,以便至少可以将标准输出/错误捕获到 MSI 日志中。此外,您不应该强制错误/回滚,因为坦率地说,回滚并没有真正回滚任何东西。 MSI 不知道您的进程外 EXE 做了什么。相反,您应该有另一个 EXE 作为卸载自定义操作。否则,您可以将安装程序标记为系统组件以禁止卸载。
    • 如果您只是不想在系统中注册 PublishProduct 标准操作,您也可以禁用它。但是,总是报告错误意味着发生了回滚,而实际上确实发生了某些事情,这确实会给操作人员带来错误的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2018-12-29
    • 2010-12-10
    相关资源
    最近更新 更多