如何卸载另一个用户安装的应用程序?

我在尝试debuggingWindows 8应用程序时遇到此问题,并且在另一个用户帐户上已经安装了一个副本:

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

有时我只能login或要求其他人login到机器并卸载应用程序。 或者,我可以更改应用程序名称/ ID,但一个不总是可能的,另一个是有风险的(我不想检查更改的应用程序ID到源代码pipe理)。

必须有一些方法来卸载它。 也许一个PowerShell脚本?

我上面的过程仍然有效,但是它只是绕过一个竞争条件问题,Windows Update(很奇怪)负责清除“上演的软件包”。

据微软说 ,“其他修复” – 我仍然认为这个问题是一个错误 – 是:

问题的原因:

Windows Update(WU)会下载更新版本的软件包,并将它们“升级”为本地系统,以便在您到商店更新应用程序时,更新过程尽可能快。 WU最终将清理那些从未安装的分阶段软件包。

有“分期”套餐有什么后果?

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

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

我如何find“分期”软件包?

  1. 在pipe理员的PowerShell提示中,命令:

    get-appxpackage -all

将显示机器上的所有包。 对于分阶段的软件包,PackageUserInformation将显示{S-1-5-18 [Unknown user]:Staged} 2.使用powershell过滤,获取所有分阶段的packagefullnames的列表,你可以这样做:

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

我该如何摆脱“Staged”软件包?

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

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

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

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

  1. 取得文件夹c:\ Program Files \ WindowsApps和C:\ ProgramData \ Microsoft \ Windows \ AppRepository的所有权 – 为pipe理员提供完全访问权限。 确保TrustedInstaller也具有修改权限。 你也拥有所有权。 如果你不知道,这是通过该文件夹上的属性来完成的。

  2. 转到服务并停止Windows安装程序服务。

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

  4. 再次启动Windows Installer服务。

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

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

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

解决办法

如果没有其他的东西适合你(对我来说也没有), 你可以改变你的应用程序清单中的包名称 (只是用其他字符replace掉最后几个字符)。 当你这样做,你将不再有冲突的包。

更改软件包名称可能不适合某些情况,但是您可以随时备份它,并在完成有问题的设备上的debugging时将其更改。

如果你想删除当前用户的应用程序,然后尝试:

Get-AppxPackage | 其中name -eq“APP.NAME”| 删除 – AppxPackage

这对我有帮助。 所以没有-all就有Get-AppxPackage。

在Windows 10上:

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

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

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

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

 Get-AppxPackage -AllUsers 

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

什么为我工作

  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 

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

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

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

虽然这不适合我,但它可能只是为别人工作…

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

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

然后select正确的包装, 确定 ,希望它会删除。

如果一切都失败了,你绝望了,就像我的情况(因为用户被删除)这一个是有点危险,但它为我工作。

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

这个答案是Auri Rahimzadeh在TAKEOWN和Intika的回答中的结合,你使用'DB Browser For SQLite'修改StateRepository-Machine.srd(这里下载: DB Browser for SQLite 3 ),唯一的区别是我只编辑了一个事情:在PackageUser中,我将User 3 (这是之前删除的用户的ID)的值更改为4 (这是我,最后创build的用户)

请务必检查用户表,并查看您的案例中的值是多less!