无法通过PowerShell卸载通用应用


11

遇到障碍时,我正在从新的Windows 10安装中卸载所有Universal Apps。

这不是我第一次这样做,它总是运行良好。但是,这一次,每当我用PowerShell编写

Get-AppxPackage -allusers | Remove-AppxPackage

或更具体

Get-AppxPackage -allusers *windowscalculator* | Remove-AppxPackage

的内容时,都会收到以下消息:

Remove-AppxPackage:部署失败,出现HRESULT:0x80073CFA,删除失败。请与您的软件供应商联系。(来自HRESULT的异常:0x80073CFA)错误0x80070032:AppX部署从以下位置删除软件包Microsoft.WindowsCalculator_10.1605.1582.0_x64__8wekyb3d8bbwe的操作:C:\ Program Files \ WindowsApps \ Microsoft.WindowsCalculator_10.1605.1582.0_x64__8wekyb3d8bbwe失败。

该应用程序是Windows的一部分,无法按用户卸载。管理员可以尝试使用“打开或关闭Windows功能”从计算机中删除该应用程序。但是,可能无法卸载该应用程序。

注意:有关其他信息,请在事件日志中查找[ActivityId] 75c5fc31-fb20-0001-77fd-c57520fbd101或使用命令行Get-AppxLog -ActivityID 75c5fc31-fb20-0001-77fd-c57520fbd101

在线:1字符:49

+ Get-appxpackage -allusers *windowscalculator* | Remove-AppxPackage + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (Microsoft.Windo...__8wekyb3d8bbwe:String) [Remove-AppxPackage], IOException + FullyQualifiedErrorId : DeploymentError,Microsoft.Windows.Appx.PackageManager.Commands.RemoveAppxPackageCommand


我尝试卸载的每个应用程序都会收到此消息,包括我知道可以完全卸载的那些应用程序,例如计算器或图像查看器,这是以前从未发生过的。
Powershell正在运行,其他一切正常,并且看起来很正常。

除了重新安装Windows,我还能做些什么吗?


1
尝试在这篇文章的最后一个条目中使用PowerShell脚本:清除系统应用程序的清除(绕过错误0x80073CFA)
harrymc '16

请回答 。
harrymc '16

@PIMP_JUICE_IT但这是在从用户帐户中卸载它们之后,从预配包中重新安装所有应用程序。首先,我无法卸载其中的任何一个,这就是问题所在。
Ryakna '16

@Ryakna您检查了我在网上发现的黑客吗?
magicandre1981'7

Answers:


5

从Windows 10周年更新开始,Microsoft IsInbox在SQLite数据库中C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srd为收件箱应用程序添加了新条目。并尝试删除标记为IsInbox失败的应用程序app 失败0x80073CFA

但是有一个丑陋的解决方法,该方法于2017年4月发现

您需要下载并安装用于SQLite的工具ProcessHackerDB Browser

  • 以admin身份运行ProcessHacker 2,选择a C:\Windows\System32\svchost.exe,右键单击并选择Misc->Run as this user

在此处输入图片说明

现在选择此处C:\Program Files\DB Browser for SQLite\DB Browser for SQLite.exe并开始。在SQLite浏览器中,单击Open database

在此处输入图片说明

并打开文件C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srd(将“打开”对话框中的文件类型更改为所有文件以查看它)。

现在,单击Browse Data选项卡,然后将表更改为Package

在此处输入图片说明

现在,选择要删除的应用IsInbox0然后将列的1更改为并保存更改。

在此处输入图片说明

对您要删除的所有应用重复此操作,现在Powersehll命令应该可以使用了。

但是作者写道,如果删除了收件箱中的应用程序,Microsoft将阻止升级到更新的Windows版本。因此,请记住这一点。


非常感谢您提供此信息。帮助我手动删除了损坏的商店应用程序,该应用程序无法通过其他任何方式删除(包括Power Shell)。
ElDog

似乎这在以后的Windows 10版本中不再起作用。数据库现在包含运行用户定义的函数的触发器,因此,如果加载的应用程序未安装必要的功能,则任何更新都会失败(“错误:无此功能:workid”)。
蒂姆·西尔维斯特

@TimSylvester您想卸载哪个应用程序?在1903年,您可以卸载更多的收件箱应用程序。
magicandre1981 '19

嗨,我知道它现在已经很老了,但我只是给笔记本电脑做个核对,因为它不会更新,并且执行此过程似乎有点熟悉。我不记得我是否确实这样做过,但是有没有办法确定我是否删除了限制更新的应用程序(显然是在其他系统上)?我可以通过任何方式使用PDQ清单进行检查,以便获取受影响的系统列表,最后,如果我重新安装了这些应用程序,将来的升级是否可以恢复?还是现在使用最新版本的Windows来解决这个问题,因为我认为MS阻止这种愚蠢的更新是很愚蠢的。
乔恩·温劳布

@JonWeinraub在当前的Windows 10版本中,您可以正式卸载更多的收件箱apps.so,您可能不需要它
magicandre1981

4

清洁除尘系统的应用程序(旁路错误0x80073CFA) 包含此PowerShell脚本:

function Enable-Privilege {  
  param($Privilege)
  $Definition = @'
using System;  
using System.Runtime.InteropServices;  
public class AdjPriv {  
  [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
  internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
    ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr rele);
  [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
  internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
  [DllImport("advapi32.dll", SetLastError = true)]
  internal static extern bool LookupPrivilegeValue(string host, string name,
    ref long pluid);
  [StructLayout(LayoutKind.Sequential, Pack = 1)]
  internal struct TokPriv1Luid {
    public int Count;
    public long Luid;
    public int Attr;
  }
  internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
  internal const int TOKEN_QUERY = 0x00000008;
  internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
  public static bool EnablePrivilege(long processHandle, string privilege) {
    bool retVal;
    TokPriv1Luid tp;
    IntPtr hproc = new IntPtr(processHandle);
    IntPtr htok = IntPtr.Zero;
    retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
      ref htok);
    tp.Count = 1;
    tp.Luid = 0;
    tp.Attr = SE_PRIVILEGE_ENABLED;
    retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
    retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero,
      IntPtr.Zero);
    return retVal;
  }
}
'@  
  $ProcessHandle = (Get-Process -id $pid).Handle
  $type = Add-Type $definition -PassThru
  $type[0]::EnablePrivilege($processHandle, $Privilege)
}

function Take-Over($path) {  
  $owner = [Security.Principal.NTAccount]'Administrators'

  $key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($path, 'ReadWriteSubTree', 'TakeOwnership')
  $acl = $key.GetAccessControl()
  $acl.SetOwner($owner)
  $key.SetAccessControl($acl)

  $acl = $key.getaccesscontrol()
  $rule = New-Object System.Security.AccessControl.RegistryAccessRule "Administrators", "FullControl", "ContainerInherit", "None", "Allow"
  $acl.SetAccessRule($rule)
  $key.SetAccessControl($acl)
}

do {} until (Enable-Privilege SeTakeOwnershipPrivilege)

function Remove-Package($name) {  
  $key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\$name"
  Take-Over $key
  Remove-Item -Path HKLM:"$key\Owners" -Force -Recurse
  & C:\Windows\System32\PkgMgr.exe /up:$name /norestart /quiet
}

#Remove Feedback
$packageBase = "Microsoft-WindowsFeedback"
$packageNames = (dir ("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\" + $packageBase + "*")).name

forEach ($package in $packageNames)
{   
    Remove-Package $package.substring($package.indexOf($packageBase))
}

在使用此脚本时,作者评论:

您可以将$ packageBase更改为不同的软件包名称。

我自己没有尝试过此脚本。


感谢您的回答。我已经在其他一些系统中尝试过该脚本,并且它确实适用于几乎所有通用应用程序,甚至某些通常不可移动的应用程序,但是,在有问题的系统上,问题仍然存在,脚本无法正常工作。它在Powershell中显示了与我尝试删除的所有应用程序完全相同的错误消息。
Ryakna '16

如果在使用“以管理员身份运行”调用PowerShell时仍然发生这种情况,则说明该计算机上有很多错误。如果这是应用商店存在的问题,请尝试以下5条提示修复Windows 10中的Windows应用商店和应用程序问题
harrymc '16

@harrymc无法使用$packageBase = "xboxapp", "officehub", "skypeapp"
JinSnow,

2

Windows周年更新,进行了许多更改,使您无法关闭某些功能,例如cortana或通过官方手段删除应用程序。诸如xbox应用程序之类的某些应用程序,微软将其视为系统中的重要应用程序,因此阻止了官方手段将其删除。

如果进入“开始”菜单,则可以右键单击它,然后单击“卸载”,相反,可以右键单击“开始”按钮,转到“设置”,然后单击“应用程序和功能”并从此处卸载它。

现在,如果您坚持要删除这些应用程序。它们保留在C:\windows\SystemApps文件夹中,因此您可以找到保留在其中的文件夹,然后删除该文件夹,或者更安全的选择是重命名它,并_在名称末尾添加一个字符,例如下划线。

只是要添加,如果您删除一个文件夹或在systemapps文件夹中重命名它,从技术上讲,这不是卸载它,而是强行删除它,如果您删除了该文件夹,则该文件可能会使其他内容仍然安装,例如注册表项和其他文件。它使用但不在systemapps文件夹中,或者如果重命名该文件夹则强制它不运行。

正如Ryakna在下面的评论中所说,使用这两个选项中的任何一个都会在以后产生问题,但是根据我的经验,我还没有遇到任何问题,包括更新。但是,仍然建议通过官方方式进行卸载,或者使用Powershell(如果您熟悉的话)或通过“程序和功能”选项或菜单选项进行卸载。SystemApps不应重命名或删除该文件夹,就像这样做一样,与重命名或删除systemapps文件夹内的文件夹相比,您很可能会遇到问题。


谢谢你的时间。问题在于此Windows映像是从11月开始的,尚未连接到Internet,因此尚未更新。此外,我只是尝试使用相同的方法从最新的Windows 10卸载商店和计算器,并且能够做到这一点而没有任何问题。
Ryakna

@Ryakna嗯,好吧,如果有人想知道其他删除方式,我将把答案
留在那儿

我无法重命名SystemApps文件夹。我必须使用BleachBit删除Xbox应用程序文件夹,这是通过官方手段无法实现的。Xbox应用仍已安装,游戏栏进程位置为~\Windows\System32。安全删除GameBar*GamePanel*在那里归档吗?
user598527

@ user598527如果您不通过官方手段(例如通过PowerShell)卸载应用程序,而只是删除或重命名文件夹,则该应用程序实际上并没有真正被卸载,并且可能在以后产生问题。而且,您不应重命名该SystemApps文件夹,因为在Windows 10中这是必不可少的。仅供参考,Windows Universal Apps文件夹C:\Windows\SystemApps用于系统应用程序文件,C:\Program Files\WindowsApps其他应用程序文件和C:\Users\Ryakna\AppData\Local\Packages应用程序数据。
Ryakna

1
@ user598527您可能已经删除了其中的一些(Xbox AppX有很多),但是我认为Xbox的主要主干无法卸载。通过Get-AppxPackage | Select Name, PackageFullName在PowerShell上运行,您可以看到系统中仍然有Xbox AppX。我认为,如果您停止并禁用Xbox服务,则可以删除游戏栏(可能是Xbox Live Networking Service
Ryakna,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.