You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows 10安装镜像预配的Appx包无法自动为新用户安装的问题排查与咨询

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

火山引擎 最新活动