对症下药 解决Windows10应用的多种难题
2021-10-23俞木发
俞木发
问题1 无法重新安装应用,提示应用已安装
笔者在卸载了《极限竞速地平线4》后再试图安装时系统却提示“Add-AppxPackage :部署失败,原因是 HRESULT:0x80073CFB,提供的程序包已安装,且禁止重新安装该程序包”(图1)。这是由于上次卸载不彻底,导致应用残留,从而让Windows 10误认为该游戏已安装所致。
火速链接
这里使用命令行对“Packages”文件夹进行了所有者和权限的更改,操作后请恢复文件夹的默认设置,否则可能会导致应用运行错误。如果还对应用的安装目录“C:\ProgramFiles\Windowsapps ” 或者“C:\windows\systemapps”执行了类似的操作,那么也需要重新恢复权限设置,具体操作可以参考本刊2021年第15期的文章《用icacls命令解决Windows 10权限难题》中所介绍的方法。
解决方法:手动完全卸载残留的应用
由于应用的安装位置是在“C:\Program Files\Windowsapps”,默认本机的管理员账户也没有访问权限,因此为了能够将其中残留的文件删除掉,我们需要先到“https://docs.microsoft.com/en-us/sysinternals/downloads/psexec”下载PsExec.zip文件,下载后将其全部解压到“D:\aa”备用。然后以管理员身份启动命令提示符,输入“d:\aa\PsExec.exe -s-i powershell”并回车(每条命令输入后均需回车确认,下同)。这里使用PsExec.exe是因为该软件可以用SYSTEM身份启动PowerShell,以便获得更高的权限来对文件进行更改。
启动Powershell后继续输入并执行“takeown /f C:\ProgramData\Microsoft\Windows\ App Repository\Packages/a|icacls C: \ProgramData\Microsoft\Windows\ AppRepository\Packages /grantadministrators:F”命令,该命令的作用是获得指定文件夹的所有权和访问权(图2)。
接着打开“C:\ProgramData\Microsoft\Windows\ AppRepository\Packages”文件夹,使用搜索功能或者手动查找,找到其中类似“Microsoft.SunriseBaseGame_1.341.398.2_x64_ _8wekyb3d 8bbwe”的文件夹(图3)。
找到上述的文件夹后,复制其文件夹名称备用,再返回Power Shell窗口输入并执行“remove-appxpackage ** Microsof t.SunriseBaseGame_1.341.398.2_x64__8wekyb3d8bbwe **”命令,即可彻底地卸载残留的游戏。最后,重新安装该游戏即可。
问题2 无法卸载内置应用,提示0x80073CFA错误
Windows 10默认安装了很多内置应用,笔者在制作系统封装包的时候都会预先将不用的内置应用卸载掉。不过在使用PowerShell卸载“Microsoft.XboxGameCallableUI”时,系统却提示0x80073CFA错误,无法卸载(图4)。
从图4中所显示的内容可以看到,无法卸载是由于此应用是Windows的一部分,无法针对每个用户卸载该应用。实际上真正的原因是:从Windows 10 1909版开始,微软对系统应用包增加了“IsInbox标志”,且将其值设置为“1”,从而导致某些系统应用(如图4中显示的应用)无法使用PowerShell正常卸载。
解决方法:更改IsInbox标志
1到“http://www.sqlitebrowser.org/dl/”下载“DB Browser for SQLite”,建议下载压缩格式的便携版,然后解压到“C: \Users\当前用户\Downloads”備用。
2启动命令提示符后输入并执行“d:\ aa\PsE xec .exe -s -i cmd.exe”(假设PsExec.exe仍以前文相同的步骤安装在“D:\aa”中),接着在启动的命令提示符窗口中输入并执行“C:\Users\当前用户\Downloads\SQ Lite Database Brow ser Portable\SQLiteDatabaseBrowserPor table.exe”命令。启动程序后点击“打开数据库”,打开“%ProgramData%\Microsoft\Windows\App Repository\ State Repository -Machine.srd”文件(图5)。
3在程序的主界面中切换到“浏览数据”,在下面的“表(T)”中选择“Package”,拖动下方的滑块,切换到“PackageFullName“列的显示,并且在“Isinbox”下输入“1”进行筛选,可以看到其中“Microsoft.XboxGameCallableUI_1000.19041.1023.0_neutral_neutral_cw5n1h2txyewy”包的“IsInbox”值为“1”(图6)。
4按提示在右侧窗格的“模式”下将“1”改为“0”并保存数据库,最后返回图4所示的窗口,再次输入并执行卸载命令,此时就可以将“Microsof t.XboxGameCallableUI”彻底地卸载掉了。