63

当我尝试调试我的 Windows 8 应用程序并且已经在另一个用户帐户上安装了一个副本时,我一直遇到这个问题:

DEP0700:应用注册失败。另一个用户已经安装了这个应用程序的打包版本。未打包的版本无法替代它。冲突的包是 {{{PackageName}}},它是由 CN={{{Certificate Stuff}}} 发布的。(0x80073cf9)

有时我可以只登录或要求其他人登录机器并卸载应用程序。或者,我可以更改应用程序名称/ID,但一个并不总是可行,另一个是有风险的(我不想将更改后的应用程序 ID 签入源代码控制)。

必须有某种方法可以卸载它。也许是 PowerShell 脚本?

4

15 回答 15

25

我上面的过程仍然有效,但它只是解决了竞争条件问题,Windows 更新(是的,很奇怪)负责清除“暂存包”。

根据 Microsoft的说法,“其他修复”——我仍然认为这个问题是一个错误——是:

问题原因:

Windows Update (WU) 会下载您拥有的较新版本的软件包并将它们“暂存”为本地系统,因此当您去商店更新应用程序时,更新过程会尽可能快。WU 最终将清理从未安装的暂存包。

拥有“分阶段”包有什么后果?

  1. 分阶段包阻止您在开发模式下安装该特定包

  2. 分阶段的包会占用一些磁盘空间,但由于硬链接,这种影响被减轻了。如果包的多个版本之间的文件相同,则 appx 部署会硬链接这些文件,而不是维护同一文件的两个单独副本。

如何找到“分阶段”包?

  1. 在管理员 powershell 提示符下,命令:

    get-appxpackage -all

将显示机器上的所有包。对于暂存的包,PackageUserInformation 将显示 {S-1-5-18 [Unknown user]: Staged} 2. 使用 powershell 过滤,获取所有暂存的 packagefullnames 的列表,您可以执行以下操作:

get-appxpackage -all |% {if ($_.packageuserinformation.installstate -eq "Staged"){$_.packagefullname}}

如何摆脱“分阶段”包?

  1. psexec从 Mark Russinovich 编写的 sysinternals 工具下载

  2. 要摆脱所有这些,请在常规管理员/提升的命令提示符(不是 powershell)中运行:

psexec -s powershell -c "get-appxpackage | remove-appxpackage"

于 2013-01-18T20:15:32.403 回答
24

Windows 10 1709 对 remove-appxpackage cmdlet 进行了改进,添加了 -allusers 作为选项。

因此,要为所有用户卸载应用程序,此命令有效:

Get-AppxPackage -AllUsers [PackageFamilyName] | Remove-AppxPackage -AllUsers

其中 [PackageFamilyName] 通常是您的包的 GUID。

警告/警告:该命令似乎使稍后重新安装(使用 DISM 重新配置包)变得非常困难,因为它似乎将每个用户单独卸载了该应用程序。进入这里太多了...

于 2018-06-21T22:37:03.310 回答
21

如果这不起作用,您还可以尝试以下对我有用的方法。请注意,这是针对我的开发机器,而不是普通用户的机器,所以我不知道它会如何影响非开发人员:-P

  1. 获取文件夹 c:\Program Files\WindowsApps 和 C:\ProgramData\Microsoft\Windows\AppRepository 的所有权 - 授予管理员完全访问权限。确保 TrustedInstaller 也具有修改权限。你也取得了所有权。如果您不知道,这是通过该文件夹上的属性完成的。

  2. 转到服务并停止 Windows Installer 服务。

  3. 打开 C:\ProgramData\Microsoft\Windows\AppRepository\ 并删除 PackageRepository.edb 文件。

  4. 再次启动 Windows Installer 服务。

  5. 以管理员身份启动 Visual Studio。

  6. 尝试启动您的应用程序。它应该工作。

运行应用程序一次后,您应该能够再次在用户模式下运行 VS。

于 2013-01-15T14:39:21.147 回答
20

解决方法

如果没有其他方法对您有用(对我来说也没有),您可以在应用清单中更改您的包名称(只需将最后几个字符替换为其他字符)。当你这样做时,你将不再有冲突的包。

更改包名称可能不适用于某些情况,但您可以随时备份并在有问题的设备上完成调试后将其更改回来......

于 2013-06-14T10:35:14.940 回答
12

如果要删除当前用户的应用程序,请尝试:

Get-AppxPackage | where name -eq "APP.NAME" | Remove-AppxPackage

它帮助了我。所以Get-AppxPackage没有-all

于 2014-09-06T10:55:57.057 回答
8

在 Windows 10 上:

首先,你需要一个像 SqliteBrowser3 这样的 SQL 数据库编辑器

  1. 以系统用户身份进行操作(使用 psexec 或其他)
  2. 制作一份C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srd
  3. 使用 SqliteBrowser3 打开该副本
  4. 您将需要编辑“package”、“packageuser”和“user”表。为此,您需要记下“用户”表中的幽灵用户 ID,然后将其删除。user然后,从“packageuser”表中删除列中具有幽灵用户 ID 的条目。
  5. tasklist /svc /fi "services eq StateRepository"
  6. StateRepository-Machine.srd备份后替换原件。
  7. 重启,然后你可以正常删除你的包

注意:您需要将自己的用户条目分配给包

于 2015-11-09T07:25:31.383 回答
5

有一组用于管理 Windows 应用商店应用的 PowerShell cmdlet。如果您以管理员身份运行以下命令,则可以列出计算机上所有用户已安装的应用程序:

Get-AppxPackage -AllUsers

不过,我还没有找到为其他用户卸载应用程序的方法。Remove-AppxPackage仅适用于当前用户。如果您删除安装了应用程序的用户,这会使一切变得更加有趣。至少在 Windows 8 的预发布版本中,这使得删除他安装的应用程序是不可能的。自最终发布以来,我成功地避免了这种情况,因此我无法确认问题仍然存在,即删除用户帐户时不会卸载应用程序。

于 2012-12-15T05:42:05.803 回答
5

我必须执行以下操作:

 get-appxpackage -all > log.txt
 notepad log.txt (search for the offending PackageFullName)
 remove-appxpackage -allusers -package "PackageFullName"

对我来说,关键是添加-allusers标志,因为没有它我收到“...因为当前用户没有安装该软件包。使用 Get-AppxPackage 查看已安装的软件包列表。 ”错误。

于 2018-09-04T16:08:10.897 回答
3

这类似于其他一些答案,尤其是@Pavel Nazarov,但适用于不同的用户。它与公认的答案不同,因为您不需要安装任何程序。

在管理员模式下的 Windows Powershell 中,运行:

get-appxpackage -all | where name -eq "{{ App Name }}" | remove-appxpackage

于 2016-11-30T16:42:41.167 回答
3

虽然这对我不起作用,但它可能只适用于其他人......

以管理员身份启动 powershell 并运行:

Get-AppxPackage -all | Out-GridView -Passthru | Remove-AppXPackage

然后选择正确的包并确定,希望它会被删除。

于 2017-11-01T07:02:06.467 回答
2

什么对我有用

 1. Close VS
 2. Open Services
 3. Stop Appx Deployment Service
 4. Open C:\ProgramData\Microsoft\Windows\AppRepository\ and delete the PackageRepository.edb file.
 5. Start Appx Deployment Service
 6. Start VS & Debug - worked like charm
于 2015-04-29T06:44:02.753 回答
1

在尝试了许多其他变体之后,我刚刚get-appxpackage -all | where name -eq "PackageName" | remove-appxpackage -AllUsers在 Win 10 v1903 上使用它并且它有效。之后我测试了包裹的存在,它消失了。

于 2019-10-10T01:14:31.180 回答
0

如果所有其他方法都失败并且您很绝望,就像我的情况一样(因为用户已被删除)这个有点危险,但它对我有用。

风险自负!我知道我的用户是在机器上创建的最后一个用户。

这个答案是 Auri Rahimzadeh 上面关于 TAKEOWN 的答案和 intika 的答案的组合,您使用“DB Browser For SQLite”修改 StateRepository-Machine.srd(在此处下载:DB Browser for SQLite 3),唯一的区别是我只编辑了一个事情:在PackageUser 中,我将值User 3(这是以前删除的用户的 ID)更改为4(这是我,最后创建的用户)

请务必检查用户表并查看在您的情况下哪些值有效!

于 2017-11-07T08:59:41.017 回答
0

在我的情况下,我需要使用: Get-AppxProvisionedPackage -online而不是 Get-AppxPackage然后相应地使用Remove-AppxProvisionedPackage -PackageName YourPackageNameHere -Online -AllUsers

于 2021-08-05T12:04:08.823 回答
0

这对我有用。

  1. 以管理员身份打开 Powershell。
  2. 执行这个命令(使用你的包名和安装它的用户)

获取-AppxPackage -名称“MyPackageBlah”-用户“blahdy”

  1. 复制输出信息中 PackageFullName 的值。

名称:MyPackageBlah
出版商:CN = BLAH
架构:X64
RESOURCEID:
版本:1.0.34.0
PackageFullName:MyPackageBlah_1.0.34.0_x64__ww4kfnnrsedz6
IsFramework:假
PackageFamilyName:MyPackageBlah_ww4kfnnrsedz6
的publisherId:ww4kfnnrsedz6
IsResourcePackage:假
IsBundle:假
IsDevelopmentMode:假
不可拆卸:假
依赖关系:{微软.UI.Xaml.2.6_2.62107.6002.0_x64__8wekyb3d8bbwe,
Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__8wekyb3d8bbwe,
Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe,
Microsoft.VCLibs.140.00_14.0.30035.0_x64__8wekyb3d8bbwe}
IsPartiallyStaged:错误
SignatureKind:开发人员
状态:好的

  1. 执行这个命令

删除-AppxPackage -Package“MyPackageBlah_1.0.34.0_x64__ww4kfnnrsedz6”-AllUsers

您现在可以在 Visual Studio 中运行您的应用程序了。

于 2021-08-14T20:25:04.433 回答