返回

手动安装.intunewin文件:脱离Intune环境测试部署

windows

手动安装 .intunewin 文件:脱离 Intune 环境的部署测试

遭遇难题:.intunewin 文件如何独立安装?

最近,我们把一些应用程序转换成了 .intunewin 格式,准备上传到 Intune 服务器。但我们碰到了一个问题:能不能在没有网络连接的情况下,在虚拟机上手动安装这些 .intunewin 包,以便在上传到 Intune 之前检查它们是否能正常安装?也就是说,有没有办法通过命令行或者脚本来独立安装这些包,而无需连接到 Intune 服务器?

问题症结:.intunewin 文件结构和 Intune 工作原理

.intunewin 文件本质上是一个经过 Intune Win32 App Packaging Tool 包装后的压缩包。它包含了应用程序安装程序、元数据(如应用名称、版本、检测规则等)以及加密和签名信息。 Intune 在部署应用程序时,会解压这个包,验证签名,然后根据元数据中的配置执行安装过程。

Intune 的客户端(Intune Management Extension, IME)负责处理这些工作。我们常规途径是,让设备连上网,通过IME下载解密文件进行安装,而直接解压 .intunewin 并尝试运行里面的安装程序通常是行不通的,因为:

  • 加密和签名: .intunewin 文件经过了加密和签名,防止篡改。直接解压可能无法通过验证。
  • 依赖关系: 有些应用安装需要特定配置或依赖文件,这些都在.intunewin文件的元数据中。
  • 检测规则: Intune 需要通过检测规则来确认应用是否安装成功。直接安装,缺少反馈机制。

解决之道:多种方法尝试

方法一: 解包与模拟安装(有限场景)

这个方法是最直接的想法,适用一些很简单的安装场景。

  1. 解压 .intunewin 文件:
    可以使用 7-Zip 或其他支持的解压工具(例如: 7z x 文件名.intunewin -o输出目录)。

  2. 查看元数据: 解压后,通常会有一个名为 IntuneWinAppUtil.exe.config 或者类似的配置文件 (例如 Detection.xmlRequirements.xml), 它以 XML 格式存储了关于应用的各种信息, 仔细查看这些元数据很重要。

  3. 寻找安装程序: 在解压后的文件夹中找到主安装程序 (通常是 .exe 或 .msi 文件)。

  4. 尝试手动安装:

    • 简单情况: 如果应用程序安装非常简单,没有特殊要求,可以直接运行安装程序试试。
    • 复杂情况: 对于更复杂的应用程序,需要根据安装程序的类型(例如,MSI, Setup.exe)使用适当的命令行参数。 从元数据 (Detection.xml或类似文件) 中找安装命令(Install command),通常这里有记录。

原理: 模拟 Intune 解包并运行安装程序的过程,但绕过了 Intune 的验证和管理流程。

局限性: 这个方法有局限性。许多应用,尤其是复杂的商业软件, 安装过程中有许多自定义步骤和复杂的校验, 会导致直接安装出错。

方法二: 使用 IntuneWinAppUtil.exe 进行内容提取 (推荐)

IntuneWinAppUtil.exe 不仅能打包应用程序,也能解包。 这比方法一可靠。

  1. 获取工具: 如果你已经安装过Microsoft Win32 Content Prep Tool , IntuneWinAppUtil.exe 应该就在你的安装目录中.
  2. 解包命令: 使用以下命令:
IntuneWinAppUtil.exe -x -i <.intunewin文件路径> -o <输出目录> -p <内容目录>
  • -x 参数用于指定解密模式
  • -i 输入的.intunewin文件。
  • -o 指定提取后的文件输出的文件夹
  • -p 解密内容的存放目录
Example
假设您的 .intunewin 文件名为 "myapp.intunewin",并且您希望将其解压到 "C:\temp\extracted" 目录:

IntuneWinAppUtil -x -i myapp.intunewin -o C:\temp\extracted -p C:\temp\extracted\content
  1. 然后手动运行: 解压后找到setup安装文件, 用 方法一 提到的分析步骤,查看Detection.xml, 并使用元数据中配置的命令行来执行安装.

原理: IntuneWinAppUtil.exe 使用 Intune 使用的相同解密方法进行解密, 并解包到指定目录, 保证文件完整,更可靠.

代码示例(powershell,静默安装一个msi为例):

$intunewinFile = "C:\Path\to\your\app.intunewin"
$extractDir = "C:\temp\extracted"

# 解压 .intunewin 文件
& "C:\Path\to\IntuneWinAppUtil.exe" -x -i $intunewinFile -o $extractDir -p "$extractDir\content"

# 找到解压后的 .msi 文件(假设只有一个 .msi)
$msiFile = Get-ChildItem -Path $extractDir -Filter "*.msi" | Select-Object -First 1

# 使用 msiexec 进行静默安装 (务必根据元数据中 install command 调整参数!)
Start-Process -FilePath "msiexec.exe" -ArgumentList "/i `"$($msiFile.FullName)`" /qn /norestart" -Wait

安全提示: 请确保您使用的 IntuneWinAppUtil.exe.intunewin 文件来源可靠,以避免安全风险.

方法三: 使用第三方工具 (例如 Intune唂 Package Tester)

有社区开发者做了一些方便易用的工具. 原理大体都是对方法二做了一些包装, 提供一个友好的图形界面. 这类工具使用比较方便,但是注意甄别来源.

  1. 查找工具: 在GitHub之类的平台,使用关键词"Intune", "intunewin" ,"test", "tester" 去搜索. 选 star 和下载数较多的.
  2. 谨慎使用: 测试性质的工具, 请确保来自可靠来源。

原理: 调用 IntuneWinAppUtil 解包.并尝试运行解包后的安装脚本.

方法四: 创建本地模拟 Intune 环境 (进阶)

这种方式适用于一些极端情况. 如果前面几个都不能正常安装.

  1. 了解 IME 功能: 需要深刻了解Intune客户端,特别是 Intune Management Extension (IME),如何安装应用. 可以参考Microsoft 的一些架构设计文档。

  2. 搭建一个本地HTTP(S)服务: 使用比如IIS Express 之类的本地环境部署服务器,将.intunewin文件放置在其目录下。 模拟分发应用包。

  3. 编写脚本或程序: 根据元数据模拟 IME的行为:

    • 创建特定的本地目录结构。
    • 从 HTTP服务 下载文件(或者直接从本地复制)。
    • 按照Detection.xml等元数据记录的 安装参数, 执行解包、安装过程.
    • 模拟注册表或文件的创建(如果检测规则是基于这些)。

原理: 重现部分 Intune 客户端的行为,最大程度地还原真实环境。

代码示例(Powershell,提供一个思路,不能直接运行):

# 假设的参数 (你需要根据实际情况填写)
$intunewinFile = "C:\path\to\myapp.intunewin"
$workingDir = "C:\Temp\IntuneSim"  #模拟工作目录
$installCommand = "setup.exe /s"   #假设的安装命令
$detectionType = "FileExists"       #检测规则类型:假设
$detectionPath = "C:\Program Files\MyApp\myapp.exe" # 检测规则文件路径:假设

# 创建模拟工作目录
if (-not (Test-Path -Path $workingDir)) {
  New-Item -ItemType Directory -Path $workingDir | Out-Null
}

# 使用IntuneWinAppUtil 解包文件到临时目录
& "C:\Path\to\IntuneWinAppUtil.exe" -x -i $intunewinFile -o $workingDir -p "$workingDir\content"

# 尝试根据提取的信息,获取installcommand
$extractedPath = $workingDir #或者$workingDir + 目录名 (通过dir确定真实路径)

[xml]$detectionxml = Get-Content "$extractedPath\Detection.xml"
$installCommandNode= $detectionxml.SelectSingleNode("//InstallCommand")

if ($installCommandNode)
{
     $installCommand =  $installCommandNode.InnerText
}
else
{
    Write-Host "无法获得安装参数."
}
#---------------------------

# 运行安装程序 (使用获取的安装参数)
Invoke-Expression "$installCommand" | Out-Null #假设installCommand 已经设置正确
Start-Sleep -s 10  #假设需要安装等待 10 秒 (仅示例)
# 检查安装是否成功(仅示例,需根据实际检测规则实现)
$installSuccess = $false

if ($detectionType -eq "FileExists")
{
        if (Test-Path -Path $detectionPath)
        {
               $installSuccess = $true
         }
}

if ($installSuccess) {
  Write-Host "应用安装模拟成功!"
} else {
  Write-Host "应用安装模拟失败!"
}

安全提示: 这种方法需要深入的技术知识。在虚拟环境中彻底测试,避免影响生产环境。

注意: 由于安装程序的复杂性和多样性, 并没有通吃的万全之策. 所以以上所有方案需要组合尝试,多加尝试,细心观察。 失败的话,请检查系统日志中安装程序的具体错误输出.