8

Я находился в процессе удаления всех универсальных приложений из новой установки Windows 10, когда столкнулся с препятствиями.

Я делаю это не первый раз, и все идет хорошо. Однако на этот раз, когда я пишу в PowerShell

Get-AppxPackage -allusers | Remove-AppxPackage

или что-то более конкретное, как

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

Я получаю следующее сообщение:

Remove-AppxPackage: Сбой развертывания с HRESULT: 0x80073CFA, Сбой удаления. Пожалуйста, свяжитесь с вашим поставщиком программного обеспечения. (Исключение из HRESULT: 0x80073CFA) ошибка 0x80070032: Операция удаления AppX Deployment над пакетом Microsoft.WindowsCalculator_10.1605.1582.0_x64__8wekyb3d8bbwe из: C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1605.1588bb6464weweb464

Это приложение является частью 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?

3 ответа3

4

Начиная с обновления Windows 10 Anniversary, Microsoft добавила новую запись IsInbox в базу данных SQLite C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srd для приложений входящих сообщений. И попытка удалить приложение, помеченное как IsInbox завершается неудачно с 0x80073CFA .

Но есть уродливый обходной путь, который был обнаружен в апреле 2017 года.

Вам необходимо скачать и установить инструменты ProcessHacker и DB Browser для SQLite.

  • запустите ProcessHacker 2 от имени администратора, выберите 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

Теперь выберите приложения, которые вы хотите удалить, и измените 1 для столбца IsInbox на 0 и сохраните изменения.

Повторите это для всех приложений, которые вы хотите удалить, и теперь команды Powersehll должны работать.

Но автор отмечает, что Microsoft блокирует обновление до более новых сборок Windows, если удаляются входящие приложения. Так что имейте это в виду.

2

Пост Чистое удаление системных приложений (ошибка обхода 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 на разные имена пакетов.

Я не пробовал этот скрипт сам.

1

Обновление Windows Anniversary внесло несколько изменений, которые мешают вам отключить определенные функции, такие как cortana или удаление приложений с помощью официальных средств. Некоторые приложения, такие как приложение xbox microsoft, считают его важным приложением для системы, что не позволяет официальным средствам удалить его.

Если вы войдете в меню «Пуск», вы можете щелкнуть по нему правой кнопкой мыши и щелкнуть «Удалить», наоборот, вы можете нажать кнопку «Пуск» правой кнопкой мыши, перейти к настройкам, затем приложениям и функциям и удалить их оттуда.

Теперь, если вы настаиваете на удалении этих приложений. Они хранятся в C:\windows\SystemApps Таким образом, вы можете найти папку, в которой она хранится, и просто удалить папку, или более безопасный вариант - переименовать ее и добавить символ, такой как подчеркивание _ в конец имени.

Просто добавьте, что если вы удаляете папку или переименовываете ее в папке systemapps, технически это не удаляет ее, а просто принудительно удаляет ее, если вы удалили папку, из-за которой могли быть установлены другие компоненты, такие как ключи реестра и другие файлы в другом месте, он использует, но не находится в папке systemapps, или заставляет его не запускаться, если вы переименовали папку.

Как сказал Рякна в комментариях ниже, использование любого из этих двух вариантов может вызвать проблемы в будущем, однако, исходя из моего опыта, мне еще не приходилось сталкиваться с какими-либо проблемами, включая обновление. Но его по-прежнему рекомендуется удалять официальными средствами: либо с помощью powershell, если вы с ним знакомы, либо с помощью пункта «Программы и функции» или пункта меню. Папка SystemApps не должна быть переименована или удалена, так как если вы это сделаете, вы, скорее всего, столкнетесь с проблемами, чем если бы вы переименовали или удалили папку в папке systemapps.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .