Windows 未安装MSI文件

Windows 未安装MSI文件,windows,windows-installer,system-administration,Windows,Windows Installer,System Administration,我目前正在为系统管理员开发一个工具,该工具可用于更新Windows广告的所有客户端。它需要与组策略和SMS配合使用,以便进行大规模更新。因此,我需要一个工具来生成一个MSI文件 是否可以创建一个MSI文件,该文件不安装任何东西,而只执行自定义操作(即运行脚本或exe文件) 向雅各布·西蒙·加德致以最诚挚的问候是的,这是可能的。可耻,但也有可能 你可以把一个方形的钉子塞进一个圆形的孔里,但是你失去了所有预期的好处 FWIW,SMS现在被称为SCCM,它可以调用EXE命令。找到了一种黑客方法来解决我

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

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


向雅各布·西蒙·加德致以最诚挚的问候是的,这是可能的。可耻,但也有可能

你可以把一个方形的钉子塞进一个圆形的孔里,但是你失去了所有预期的好处


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

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

<?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服务进行一些配置,然后回滚安装,因为我强制发生错误。

可耻?这里最可耻的是微软的微星系统。与ie.DEB/APT相比,它区分二进制、源代码和虚拟包,并通过存储库概念支持包间依赖关系,MSI是如此不灵活。是的,很丢脸。如果你是这样的专家,你可以解释原因。事实上,你甚至不必问这个问题。如果你告诉我们你的EXE是什么,我打赌我可以告诉你如何在MSI中做同样的事情而不违反最佳实践。这是一个可怕的,可怕的反模式。但是如果你真的要这样做,你应该用Quiet Execute自定义动作包装你的EXE,这样标准的输出/错误至少可以被捕获到MSI日志中。此外,您不应该强制执行错误/回滚,因为坦率地说,回滚并没有真正回滚任何内容。MSI不知道进程外EXE做了什么。相反,您应该有另一个EXE作为卸载自定义操作。否则,您可以将安装程序标记为系统组件以禁止卸载。或者,如果您只是不想在系统中注册PublishProduct标准操作,则可以禁用该操作。但是总是报告一个错误,暗示在实际发生某些事情时发生了回滚,这确实给了操作人员错误的想法。