web-dev-qa-db-ja.com

PowerShellを介してユニバーサルアプリをアンインストールできません

ロードブロッキングが発生したとき、私は新しいWindows 10インストールからすべてのユニバーサルアプリをアンインストールしている最中でした。

私がこれを行うのは初めてではなく、常にうまくいきます。しかし、今回は、PowerShellで書くたびに

_Get-AppxPackage -allusers | Remove-AppxPackage_

またはより具体的なもの

_Get-AppxPackage -allusers *windowscalculator* | Remove-AppxPackage_

次のメッセージが表示されます:

Remove-AppxPackage:HRESULTで展開が失敗しました:0x80073CFA、削除に失敗しました。ソフトウェアベンダーにお問い合わせください。 (HRESULTからの例外:0x80073CFA)エラー0x80070032:パッケージMicrosoft.WindowsCalculator_10.1605.1582.0_x64__8wekyb3d8bbweのAppX Deployment Remove操作: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の再インストール以外にできることはありますか?

11
Ryakna

Windows 10 Anniversary Updateから、MicrosoftはSQLiteデータベースC:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srdに新しいエントリIsInboxをインボックスアプリ用に追加しました。また、IsInboxのフラグが付いたアプリappを削除しようとすると、0x80073CFAで失敗します。

しかし、醜い回避策があります。それは 2017年4月に発見されました でした。

ツール ProcessHacker および DB Browser for SQLite をダウンロードしてインストールする必要があります。

  • processHacker 2を管理者として実行し、C:\Windows\System32\svchost.exeを選択し、右クリックしてMisc-> Run as this userを選択します

enter image description here

ここでC:\Program Files\DB Browser for SQLite\DB Browser for SQLite.exeを選択して開始します。 SQLiteブラウザでOpen databaseをクリックします

enter image description here

そして、ファイルC:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srdを開きます(開くダイアログのファイルタイプをすべてのファイルに変更して表示します)。

次に、Browse Dataタブをクリックし、テーブルをPackageに変更します。

enter image description here

次に、削除するアプリを選択し、列の1をIsInbox0に変更して、変更を保存します。

enter image description here

削除するすべてのアプリについてこれを繰り返します。これで、Powersehllコマンドが機能するはずです。

しかし、著者は書いている、受信ボックスアプリが削除された場合、Microsoftは新しいWindowsビルドへのアップグレードをブロックする。これを覚えておいてください。

5
magicandre1981

投稿 システムアプリのクリーンな削除(バイパスエラー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を別のパッケージ名に変更できます。

私はこのスクリプトを自分で試したことはありません。

4
harrymc

Windows Anniversaryの更新により、Cortanaなどの特定の機能をオフにしたり、公式な方法でアプリを削除したりできないようにするためのかなりの数の変更が行われました。 xboxアプリのような一部のアプリは、Microsoftがシステムにとって重要なアプリであると判断したため、公式な方法でアプリを削除できませんでした。

スタートメニューに移動した場合は、右クリックして[アンインストール]をクリックできます。逆に、スタートボタンを右に移動して、設定に移動し、アプリと機能に移動して、そこからアンインストールできます。

これらのアプリの削除に固執している場合。それらはC:\windows\SystemAppsそれで、それが保持されているフォルダーを見つけて、そのフォルダーを削除するか、安全なオプションとして、名前を変更して下線などの文字を追加します_から名前の末尾まで。

追加するだけで、フォルダーを削除したり、systemappsフォルダー内の名前を変更したりしても、技術的にはアンインストールせず、強制的に削除します。フォルダーを削除すると、レジストリキーやその他のファイルなど、他のファイルがインストールされたままになる可能性があります。 systemappsフォルダーを使用しますが、フォルダーに名前を変更した場合は実行されません。

以下のコメントでRyaknaが述べたように、これらのオプションの2つを使用すると、後で問題が発生する可能性がありますが、私の経験から、更新などの問題はまだ発生していません。ただし、正式な方法でアンインストールすることをお勧めします。詳しくは、Powershellを使用するか、プログラムと機能のオプションまたはメニューオプションを使用してください。 SystemAppsフォルダーの名前を変更したり削除したりしないでください。これを行うと、systemappsフォルダー内のフォルダーの名前を変更したり削除したりする場合よりも、問題が発生する可能性が高くなります。

2
Frostalf