通过 Intune 将 appx 包作为 MSI 进行侧载

通过 Intune 将 appx 包作为 MSI 进行侧载

在我们的环境中,我们有加入 Windows 8.1 Enterprise 域的计算机,这些计算机通常不会接入公司网络。我们使用 Microsoft Intune 远程管理笔记本电脑。我们还使用 Intune 将新程序推送到笔记本电脑。当程序可以通过 MSI 安装程序安装时,这种方法非常有效。

然而,我们创建了一个内部的 Windows 8.1 应用程序,它创建了一个 APPX 包。事实证明,将 APPX 包作为旁加载应用程序推送/部署极其困难。事实上,根据 Intune 团队的反馈(这里)事实上这是不可能的......

答案1

为了解决这个问题,我们制定了一个解决方案,灵感来自这个博客使用 MSI 安装程序侧载 appx 包WIX 工具集

我们想要共享 WIX 代码以生成 MSI 安装程序。此 MSI 安装程序可用于在所需的目标机器上部署 appx,例如使用 Intune。

MSI 将首先将 appx 和依赖项复制到 ProgramFilesFolder 子文件夹,然后执行 dism.exe /online /Add-ProvisionedAppxPackage 命令以侧载应用程序。注意:目标计算机必须能够侧载应用程序(这是更多细节)。

代码可以进一步改进,以处理 x64 依赖项并在卸载期间清理 appx。

WIX XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- Versioning -->
<?define InstallerProductVersion = "1.0.0.0" ?>

<!-- Product info -->
<?define AppxPackageName = "YOURAPPNAME.appx" ?>
<?define ProductName = "Title of the app" ?>
<?define ProductManufacturer = "YOUR COMPANY NAME" ?>
<?define UpdateCode = "A GUID" ?> <!-- keep this for version updates -->

<!-- Install settings-->
<?define InstallFolderName = "Folder for installation files" ?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="$(var.ProductName)" Language="1033" Version="$(var.InstallerProductVersion)" 
        Manufacturer="$(var.ProductManufacturer)" ="$(var.UpdateCode)">
<Package InstallerVersion="500" Compressed="yes" Comments="your comment" Manufacturer="$(var.ProductManufacturer)"
         Description="Installer for $(var.ProductName)" Languages="1033" SummaryCodepage="1252" />

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

<!-- the icon -->
<Icon Id="icon.ico" SourceFile=".\yourIco.ico"/>
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<Property Id='ARPCONTACT'>[email protected]</Property>
<Property Id='ARPHELPLINK'>www.yourcompany.com</Property>

<!-- the media -->  
<MediaTemplate EmbedCab="yes" />

<Feature Id="ProductFeature" Title="SideloadWithWiXSetup" Level="1">
  <ComponentGroupRef Id="ComponentGroup.App" />
  <ComponentGroupRef Id="ComponentGroup.Dependencies" />
</Feature>
<UIRef Id="WixUI_Minimal" />
<WixVariable Id="WixUILicenseRtf" Value="end user licence agreement.rtf" />

<CustomAction Id="DISMInstallAppx" Directory="INSTALLFOLDER" Execute="commit" Impersonate="no" ExeCommand="dism.exe /online /Add-ProvisionedAppxPackage /PackagePath:&quot;$(var.AppxPackageName)&quot; /SkipLicense" Return="check" />

<InstallExecuteSequence>
  <Custom Action="DISMInstallAppx" After="InstallFiles" >(NOT Installed) OR WIX_UPGRADE_DETECTED OR REPAIR</Custom>
</InstallExecuteSequence>
</Product>

<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLFOLDER" Name="$(var.InstallFolderName)">
        <Directory Id="DEPENDENCIES" Name="Dependencies">
            <Directory Id="DEPENDENCIESx86" Name="x86" />
        </Directory>
    </Directory>
  </Directory>
</Directory>
</Fragment>

<Fragment>
<!-- ComponentGroup.App  -->
<ComponentGroup Id="ComponentGroup.App" Directory="INSTALLFOLDER">
  <!-- Program components -->
  <Component Id="Component.AppxPackage" >
    <File Id="File.AppxPackage" Source="$(var.AppxPackageName)" KeyPath="yes" Checksum="yes" />
  </Component>
</ComponentGroup>
<ComponentGroup Id="ComponentGroup.Dependencies" Directory="DEPENDENCIESx86">
    <Component Id="Dependencies.VCLib">
        <File Id="File.VCLib" Source="Dependencies\x86\Microsoft.VCLibs.x86.12.00.appx" KeyPath="yes" Checksum="yes" />
    </Component>
</ComponentGroup>
</Fragment>
</Wix>

相关内容