首页 > 系统相关 >MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows内置应用

MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows内置应用

时间:2023-06-09 18:31:31浏览次数:67  
标签:应用 Windows Value Write 进阶篇 LogEntry 移除 Microsoft

前言

由于工作等原因(借口),距离发布上一篇MDT系列的文章已经过去一年 ::twemoji:sweat::

上一章我记录了基于MDT如何使用一个Task即可实现制作Windows基础wim镜像+DIY基础软件+捕捉镜像传送门

有好多同学一直咨询在制作捕捉镜像的时候遇到的常见的2个问题:

  1. 如何彻底的移除掉Windows10中内置的应用;
  2. 手动移除掉一些应用后就无法执行sysprep该如何解决;

接下来我会分别用两篇文章去记录我使用的解决方法。本篇将介绍:如何按需移除掉Windows10中内置应用


环境准备

本文为 微风 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.


操作说明

获取内置应用清单

微软在过去几年,几乎每个版本的Windows都会有新增一些新的内置应用。为了便于前后的效果对比,我这里也通过ISO安装一个默认系统。

默认系统安装完成后,手动更新系统补丁以及Windows Store应用。

基于微软介绍,Windows内置应用包含以下两种:

官方文档


  1. 预配应用:Provisioned Apps
  2. 系统应用:System Apps

然后以管理员身份执行powershell,并执行以下命令,即可将系统中所有预配应用的列表列出:

# 获取provisioned-apps
Get-AppxProvisionedPackage -Online | Format-Table DisplayName, PackageName

# 获取system-apps
Get-AppxPackage -PackageTypeFilter Main | ? { $_.SignatureKind -eq "System" } | Sort Name | Format-Table Name, InstallLocation

通过上述方法即可获取到当前系统的所有内置应用,然后将你需要保留的应用名称单独记录下来,后面通过脚本执行除去现有记录的应用外,其他所有内置应用执行卸载操作。

注意:因为不同的Windows版本其内置的应用清单会有所不同,所以我这里做一个需要保留的应用白名单,除白名单外的应用均执行卸载。


卸载脚本

<#
.SYNOPSIS
    Remove built-in apps (modern apps) from Windows 10.

.DESCRIPTION
    此脚本将删除所有未在此脚本的“白名单”中指定的预配包中内置应用程序。
    它支持MDT和ConfigMgr使用,但仅适用于在线场景,所以它不能在WinPE阶段执行。
    有关每个Windows 10版本中可用应用程序的更详细列表,请参阅此处的文档:
    https://docs.microsoft.com/en-us/windows/application-management/apps-in-windows-10

.EXAMPLE
    .\Invoke-RemoveBuiltinApps.ps1

#>
Begin {
    # White list of Features On Demand V2 packages
    $WhiteListOnDemand = "NetFX3|DirectX|Tools.DeveloperMode.Core|Language|InternetExplorer|ContactSupport|OneCoreUAP|WindowsMediaPlayer|Hello.Face|Notepad|MSPaint|PowerShell.ISE|ShellComponents"

    # White list of appx packages to keep installed
    $WhiteListedApps = New-Object -TypeName System.Collections.ArrayList
    $WhiteListedApps.AddRange(@(
            "Microsoft.DesktopAppInstaller",
            "Microsoft.Office.OneNote",
            "Microsoft.Messaging", 
            "Microsoft.MSPaint",
            "Microsoft.Windows.Photos",
            "Microsoft.StorePurchaseApp",
            "Microsoft.MicrosoftOfficeHub",
            "Microsoft.MicrosoftStickyNotes",
            "Microsoft.WindowsAlarms",
            "Microsoft.WindowsCalculator", 
            "Microsoft.WindowsCommunicationsApps", # Mail, Calendar etc
            "Microsoft.WindowsSoundRecorder", 
            "Microsoft.WindowsStore"
        ))

    # Windows 10 version 1809
    $WhiteListedApps.AddRange(@(
            "Microsoft.ScreenSketch",
            "Microsoft.HEIFImageExtension",
            "Microsoft.VP9VideoExtensions",
            "Microsoft.WebMediaExtensions",
            "Microsoft.WebpImageExtension"
        ))

    # Windows 10 version 1909
    $WhiteListedApps.AddRange(@(
            "Microsoft.Outlook.DesktopIntegrationServicess"
        ))

    # Windows 10 version 2004
    $WhiteListedApps.AddRange(@(
            "Microsoft.VCLibs.140.00"
        ))

    # Windows 10 version 20H2
    $WhiteListedApps.AddRange(@(
            "Microsoft.MicrosoftEdge.Stable"
        ))

    # Windows 10 version 2H2
    $WhiteListedApps.AddRange(@(
            "Microsoft.WindowsCamera",
            "Microsoft.YourPhone",
            "Microsoft.ZuneMusic",
            "Microsoft.ZuneVideo",
            "Microsoft.Microsoft3DViewer"
            # Add the appname which you want keep here.
        ))
}
Process {
    # Functions
    function Write-LogEntry {
        param(
            [parameter(Mandatory = $true, HelpMessage = "Value added to the RemovedApps.log file.")]
            [ValidateNotNullOrEmpty()]
            [string]$Value,

            [parameter(Mandatory = $false, HelpMessage = "Name of the log file that the entry will written to.")]
            [ValidateNotNullOrEmpty()]
            [string]$FileName = "RemovedApps.log"
        )
        # Determine log file location
        $LogFilePath = Join-Path -Path $env:windir -ChildPath "Temp\$($FileName)"

        # Add value to log file
        try {
            Out-File -InputObject $Value -Append -NoClobber -Encoding Default -FilePath $LogFilePath -ErrorAction Stop
        }
        catch [System.Exception] {
            Write-Warning -Message "Unable to append log entry to $($FileName) file"
        }
    }

    # Initial logging
    Write-LogEntry -Value "Starting built-in AppxPackage, AppxProvisioningPackage and Feature on Demand V2 removal process"

    # Determine provisioned apps
    $AppArrayList = Get-AppxProvisionedPackage -Online | Select-Object -ExpandProperty DisplayName

    # Loop through the list of appx packages
    foreach ($App in $AppArrayList) {
        Write-LogEntry -Value "Processing appx package: $($App)"

        # If application name not in appx package white list, remove AppxPackage and AppxProvisioningPackage
        if (($App -in $WhiteListedApps)) {
            Write-LogEntry -Value "Skipping excluded application package: $($App)"
        }
        else {
            # Gather package names
            $AppPackageFullName = Get-AppxPackage -Name $App | Select-Object -ExpandProperty PackageFullName -First 1
            $AppProvisioningPackageName = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -like $App } | Select-Object -ExpandProperty PackageName -First 1

            # Attempt to remove AppxPackage
            if ($AppPackageFullName -ne $null) {
                try {
                    Write-LogEntry -Value "Removing AppxPackage: $($AppPackageFullName)"
                    Remove-AppxPackage -Package $AppPackageFullName -ErrorAction Stop | Out-Null
                }
                catch [System.Exception] {
                    Write-LogEntry -Value "Removing AppxPackage '$($AppPackageFullName)' failed: $($_.Exception.Message)"
                }
            }
            else {
                Write-LogEntry -Value "Unable to locate AppxPackage for current app: $($App)"
            }

            # Attempt to remove AppxProvisioningPackage
            if ($AppProvisioningPackageName -ne $null) {
                try {
                    Write-LogEntry -Value "Removing AppxProvisioningPackage: $($AppProvisioningPackageName)"
                    Remove-AppxProvisionedPackage -PackageName $AppProvisioningPackageName -Online -ErrorAction Stop | Out-Null
                }
                catch [System.Exception] {
                    Write-LogEntry -Value "Removing AppxProvisioningPackage '$($AppProvisioningPackageName)' failed: $($_.Exception.Message)"
                }
            }
            else {
                Write-LogEntry -Value "Unable to locate AppxProvisioningPackage for current app: $($App)"
            }
        }
    }

    # Complete
    Write-LogEntry -Value "Completed built-in AppxPackage, AppxProvisioningPackage and Feature on Demand V2 removal process"
}



脚本用法

将上述脚本复制并保存到MDT的Scripts目录中,我的存放在%SCRIPTROOT%\Custom\Remove-Builtin-Apps\Invoke-RemoveBuiltinApps.ps1


该脚本也可以用在SCCM的Task中,具体使用方法请参考下图

MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows内置应用_MDT部署Windows


执行效果

本篇不再介绍如何捕捉镜像以及过程中创建暂停任务功能,如需可参考上一篇文档。

执行前应用的数量:

MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows内置应用_MDT_02

任务执行状态:

执行后应用的数量:

MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows内置应用_MDT_03

日志文件:

MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows内置应用_MDT制作镜像_04


后续

至此,已经完成在制作捕捉镜像时移除不需要的系统内置应用的需求。

但如果不出意外(你的环境中服务器、客户端能否访问互联网并且执行了系统更新时)你将会在Sysprep过程中遇到如下错误:(

MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows内置应用_MDT_05

Error SYSPRP Package <PackageFullName> was installed for a user, but not provisioned for all users. This package will not function properly in the sysprep image.
<Date> <Time>, Error SYSPRP Failed to remove apps for the current user: 0x80073cf2.
<Date> <Time>, Error SYSPRP Exit code of RemoveAllApps thread was 0x3cf2.
....

下一篇我将介绍使用多种方式解决因删除或更新包含内置Windows映像的Microsoft Store应用后Sysprep失败的问题。


Enjoy ~~ :) 

标签:应用,Windows,Value,Write,进阶篇,LogEntry,移除,Microsoft
From: https://blog.51cto.com/jasonhuang/6441539

相关文章

  • 一步步教学在 Windows 下面安装 pytorch3d 来部署 xuniren 这个项目
    对于这篇教程打算上个星期就准备写了,无奈一直在跑产品和参加行业活动,始终迟迟未能和大家见面。这个项目主要是小郭总开源的Fay虚拟人控制器然后看到有这么一个真人2D的项目——xuniren,激发了我部署项目的好奇心。从而有了一些经验(踩了很多坑),顺利在几台电脑上跑通,而且远程也帮......
  • vc6,windows 7 x64 调试 (IS2120@BG57IV3)
    //z2012-12-2416:31:[email protected]在windows7x64上调试vc6console程序时,按了shift+f5,程序并不结束。解决方法:替换这个文件TLLOC.dllwww.dr-hoiby.com/TLLOC.dll//z2012-12-2416:31:[email protected]......
  • Qt安装完后想要添加组件怎么办但是添加或移除组件为灰色不可用是怎么回事?
    总共有三个选项第一个就是添加或移除组件不可用,自动选择第二个,这里其实就是版本需要升级,升级完后重启再次选择添加或移除组件就可以了。补个阿里云的qt源:https://mirrors.aliyun.com/qt/......
  • 利用云服务器实现内网穿透(frp),开启个人电脑(windows)可远程桌面访问
     前言:利用微软自带的远程桌面进行访问,但无奈没有固定的公网地址,使用其他三方软件免费使用会有网络延迟等问题,因此需要一个相对稳妥的方式,那便是配合frp内网穿透实现远程访问个人电脑前提:有一台云服务器(需要公网ip,最好是国内的,延迟会较低) 教程步骤:1.下载frpfrp分为客......
  • Windows证书管理器 && SSL certification && WSL-Docker: curl: (60) SSL certificat
    深入浅出certmgr——Windows证书管理器https://www.fke6.com/html/91605.html计算机安全是当前社会的一个重要议题,证书是一种重要的安全机制,负责证明数据、软件或者人的身份和信誉。certmgr(即“证书管理器”)是Windows中专门用于证书管理的工具。本文将从多个方面对certmgr进行深......
  • 有什么Windows电脑上好用地记笔记软件
    当你每天的工作事项非常多时,就会有很多事情需要记住,面对繁琐复杂的各种事项,很多人的记忆力都是有限的,很容易就会忘记工作事项,这应该怎么办呢?其实随着工作量的增加,想要快速、准确的记住琐碎的工作信息,借助一款记笔记软件可以起到事半功倍的作用。一般大多数上班族使用的办公设备都......
  • 链表-移除链表元素
    点击查看代码varremoveElements=function(head,val){vardummyNode=newListNode(-1);//设置一个虚拟头节点dummyNode.next=head;varprev=dummyNode;//prev记录当前节点的前一个节点while(prev.next){//从head开始遍历链表if(......
  • windows系统上安装与使用Android NDK r5
     很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单的android  一:什么是NDKNDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk      ......
  • windows安装git和用法
    1、windows下载gitgit官网地址:https://git-scm.com/download/win/国内下载地址:https://registry.npmmirror.com/binary.html?path=git-for-windows/ 选择所需要的版本,进行下载。2、下载完成之后,双击下载好的exe文件进行安装。 3、默认是C盘,推荐修改一下路径(非中文并......
  • windows 10 wsl 环境 docker 无法正常启动 -The system cannot find the file specif
    错误信息:errorduringconnect:inthedefaultdaemonconfigurationonWindows,thedockerclientmustberunwithelevatedprivilegestoconnect:Get"http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json":open//./pipe/docker_engine:Thesy......