web-dev-qa-db-fra.com

Impossible de désinstaller Universal Apps via PowerShell

J'étais en train de désinstaller toutes les applications universelles d'une nouvelle installation de Windows 10 lorsque j'ai frappé un roadblock.

Ce n'est pas la première fois que je fais ça et ça va toujours bien. Cependant, cette fois, chaque fois que j'écris dans PowerShell

Get-AppxPackage -allusers | Remove-AppxPackage

ou quelque chose de plus spécifique comme

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

Je reçois le message suivant:

Remove-AppxPackage: Le déploiement a échoué avec HRESULT: 0x80073CFA, la suppression a échoué. Veuillez contacter votre fournisseur de logiciel. (Exception de HRESULT: 0x80073CFA) erreur 0x80070032: opération de déploiement AppX sur le package Microsoft.WindowsCalculator_10.1605.1582.0_x64__8wekyb3d8bbwe à partir de:.

Cette application fait partie de Windows et ne peut pas être désinstallée par utilisateur. Un administrateur peut tenter de supprimer l'application de l'ordinateur en utilisant Activer ou désactiver des fonctionnalités Windows. Cependant, il peut ne pas être possible de désinstaller l'application.

REMARQUE: pour plus d'informations, recherchez [ActivityId] 75c5fc31-fb20-0001-77fd-c57520fbd101 dans le journal des événements ou utilisez la ligne de commande Get-AppxLog -ActivityID 75c5fc31-fb20-0001-77fd-c57520fbd10.

À la ligne: 1 caractère: 49

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


Je reçois ce message pour chaque application que je tente de désinstaller, y compris celles que je sais parfaitement parfaitement désinstallées, comme la calculatrice ou la visionneuse d'images, ce qui ne s'était jamais produit auparavant.
Powershell est surélevé et tout le reste fonctionne et semble normal.

Puis-je faire autre chose que de réinstaller Windows?

11
Ryakna

À compter de la mise à jour anniversaire de Windows 10, Microsoft a ajouté une nouvelle entrée IsInbox dans la base de données SQLite C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srd pour les applications de la boîte de réception. Et essayer de supprimer une application app marquée comme IsInbox échoue avec 0x80073CFA.

Mais il existe une solution de contournement moche, qui a été découverte en avril 2017 .

Vous devez télécharger et installer les outils ProcessHacker et le navigateur de base de données pour SQLite . .

  • exécutez ProcessHacker 2 en tant qu'administrateur, sélectionnez un C:\Windows\System32\svchost.exe, faites un clic droit et sélectionnez Misc-> Run as this user

enter image description here

Maintenant, sélectionnez ici C:\Program Files\DB Browser for SQLite\DB Browser for SQLite.exe et lancez-le. Dans le navigateur SQLite, cliquez sur Open database

enter image description here

et ouvrez le fichier C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srd (changez le type de fichier dans la boîte de dialogue ouverte pour l’afficher dans tous les fichiers).

Maintenant, cliquez sur l'onglet Browse Data et modifiez le tableau en Package

enter image description here

Maintenant, sélectionnez les applications que vous souhaitez supprimer et modifiez le 1 pour la colonne IsInbox en 0 et enregistrez les modifications.

enter image description here

répétez cette opération pour toutes les applications que vous souhaitez supprimer. Les commandes Powersehll devraient maintenant fonctionner.

Mais l'auteur écrit que Microsoft bloque la mise à niveau vers les nouvelles versions de Windows si les applications de la boîte de réception sont supprimées. Alors gardez cela à l'esprit.

4
magicandre1981

La publication de la suppression complète des applications système (erreur de contournement 0x80073CFA) contient le script PowerShell suivant:

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))
}

En utilisant ce script, l'auteur remarque:

Vous pouvez remplacer $ packageBase par différents noms de paquets.

Je n'ai pas essayé ce script moi-même.

2
harrymc

La mise à jour Windows anniversaire a apporté de nombreuses modifications qui vous empêchent de désactiver certaines fonctionnalités, telles que Cortana ou de supprimer des applications par des moyens officiels. Certaines applications, telles que l’application xbox, Microsoft l’ont considérée comme une application importante pour le système, empêchant ainsi les moyens officiels de la supprimer.

Si vous allez dans le menu Démarrer, vous pouvez cliquer dessus avec le bouton droit de la souris et cliquer sur Désinstaller. À l'inverse, vous pouvez également cliquer sur le bouton Démarrer, aller dans les paramètres, puis dans les applications et fonctionnalités et le désinstaller à partir de là.

Maintenant, si vous insistez pour supprimer ces applications. Ils sont conservés dans C:\windows\SystemApps Ainsi, vous pouvez trouver le dossier dans lequel il est conservé et le supprimer ou l’option plus sûre consiste à le renommer et à ajouter un caractère tel que le trait de soulignement _ à la fin du nom.

Juste pour ajouter, si vous supprimez un dossier ou le renommez à l'intérieur du dossier systemapps, techniquement, vous ne devez pas le désinstaller, mais simplement le supprimer de force, si vous supprimiez le dossier, ce qui pourrait laisser d'autres éléments installés tels que des clés de registre et d'autres fichiers ailleurs. il utilise mais ne se trouve pas dans le dossier systemapps, ou le force à ne pas s'exécuter si vous avez renommé le dossier.

Comme Ryakna l’a dit dans les commentaires ci-dessous, l’utilisation de l’une ou l’autre de ces options peut poser problème par la suite, mais d’après mon expérience, je n’ai encore rencontré aucun problème, y compris la mise à jour. Mais il est toujours recommandé de désinstaller par des moyens officiels, soit en utilisant powershell si vous le connaissez bien, soit en utilisant l'option de programmes et fonctionnalités ou l'option de menu. Le dossier SystemApps ne doit pas être renommé ni supprimé. Dans ce cas, vous rencontrerez probablement des problèmes que si vous deviez renommer ou supprimer un dossier du dossier systemapps.

1
Frostalf