Windows 10安装镜像预配的Appx包无法自动为新用户安装的问题排查与咨询
我最近在尝试给Windows 10安装镜像(install.wim)添加一些更新后的额外包,比如新版的Desktop App Installer和PowerShell。我已经能顺利把这些包预配到挂载的WIM镜像里,过程没有报错,用这个镜像安装Windows也能成功完成。
但我之前一直以为预配的包会自动为所有新用户完成安装,结果实际情况并非如此。不过我可以通过PowerShell手动离线安装(不需要联网),具体命令如下:
$package = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -eq "Microsoft.DesktopAppInstaller" } Add-AppxPackage -RegisterByFamilyName -MainPackage $package.PackageName
我想请教一下:是不是我在生成install.wim的时候漏了某个关键步骤,导致这些包没法自动安装?还是说这本来就是预期的结果?我可以添加一个首次登录脚本自动执行上面的命令,但能不用的话我真不想多这一步操作。
操作步骤示例
下面是我添加DesktopAppInstaller的具体操作流程:
# 前提是以下文件已准备好: # C:\Deploy\install.wim # C:\Deploy\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle # C:\Deploy\Packages\Microsoft.UI.Xaml.2.7.appx # C:\Deploy\Packages\Microsoft.VCLibs.x64.14.00.Desktop.appx # C:\Deploy\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe_License1.xml # C:\Deploy\mount(一个空文件夹) $packages = "C:\Deploy\Packages" $mount = "C:\Deploy\mount" $image = "C:\Deploy\install.wim" Mount-WindowsImage -Path $mount -ImagePath $image -Index 1 Add-AppxProvisionedPackage -Path $mount -PackagePath $packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle -DependencyPackagePath $packages\Microsoft.UI.Xaml.2.7.appx,$packages\Microsoft.VCLibs.x64.14.00.Desktop.appx -LicensePath $packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe_License1.xml Dismount-WindowsImage -Path $mount -Save # 最后把更新后的install.wim复制到安装介质中
初步文档调研结果
我查了相关文档后,发现可能这种做法本身就存在限制。我是从GitHub下载的这些包,但它们本质上还是属于微软商店应用(毕竟也能从微软商店获取)。文档里提到:
无法侧载从微软商店下载的应用。要安装不属于业务线的Windows应用,必须使用微软商店。
进一步实验发现
经过更多测试,我发现这些包最终还是会自动完成安装,不需要用户手动干预,但这个过程要等待大约15分钟,这实在不太理想!
查看Appx日志后发现,在"Edge"或者"Search"(WSearch服务)的任务启动后,要等15分钟左右才会开始安装,但我搞不清这些任务在后台做什么,也没法阻止它们。
另外,我之前误以为自动执行手动安装命令需要管理员权限,但看文档后发现,只有Get-AppxProvisionedPackage需要管理员权限,Add-AppxPackage用普通权限就能运行。于是我添加了一个RunOnce任务来加速安装,具体步骤如下:
# 前提文件同上 $packages = "C:\Deploy\Packages" $mount = "C:\Deploy\mount" $image = "C:\Deploy\install.wim" Mount-WindowsImage -Path $mount -ImagePath $image -Index 1 Add-AppxProvisionedPackage -Path $mount -PackagePath $packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle -DependencyPackagePath $packages\Microsoft.UI.Xaml.2.7.appx,$packages\Microsoft.VCLibs.x64.14.00.Desktop.appx -LicensePath $packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe_License1.xml $packageName = Get-AppxProvisionedPackage -Path $mount | Where-Object { $_.DisplayName -eq "Microsoft.DesktopAppInstaller" } | Select-Object -ExpandProperty PackageName reg load "HKU\DefaultUser" "$mount\Users\Default\NTUSER.DAT" $key = "Registry::HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\RunOnce" # 如果RunOnce键不存在则创建,同时关闭句柄以便后续顺利卸载注册表 hive if ( -Not (Test-Path $key)) { (New-Item -Path $key -Force).Handle.Close() } New-ItemProperty -Path $key -Name "DeployAppInstaller" -PropertyType ExpandString -Value ("""%systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe"" -WindowStyle Hidden -ExecutionPolicy ByPass -Command ""Add-AppxPackage -RegisterByFamilyName -MainPackage '{0}'""" -f $packageName) -Force # 先触发垃圾回收,再等待1秒(这一步可能不是必须的) [gc]::Collect() Start-Sleep -Seconds 1 reg unload "HKU\DefaultUser" Dismount-WindowsImage -Path $mount -Save # 最后把更新后的install.wim复制到安装介质中
最终解决方案
后来我又回头试了一下,在Add-AppxProvisionedPackage命令里加上-Regions All参数后,这些包就不需要用上面的RunOnce脚本,就能自动为新用户安装了。看起来要让预配的包自动给新用户安装,要么添加-Regions参数,要么(我还没试过)把应用添加到LayoutModification.xml配置文件里。
备注:内容来源于stack exchange,提问作者NickSlash




