在我们的环境中,我们有加入 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:"$(var.AppxPackageName)" /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>