Невозможно удалить универсальные приложения через PowerShell

11

Я был в процессе удаления всех универсальных приложений из новой установки 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.1588bb6464weweb664

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

Ryakna
источник
1
Попробуйте скрипт PowerShell в последней записи этого поста: Чистое удаление системных приложений (ошибка обхода 0x80073CFA) .
Harrymc
Ответьте, пожалуйста .
Harrymc
@PIMP_JUICE_IT Но это значит переустановить все приложения из предоставленных пакетов ПОСЛЕ удаления их из учетной записи пользователя. Во-первых, я не смог удалить ни одного из них, вот в чем проблема.
Рякна
@Ryakna ты проверил взлом, который я нашел в сети?
magicandre1981

Ответы:

5

Начиная с обновления 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, если удаляются входящие приложения. Так что имейте это в виду.

magicandre1981
источник
Большое спасибо за эту информацию. Помог мне вручную удалить испорченное приложение магазина, которое было невозможно удалить другим способом (включая Power Shell).
ElDog
Кажется, что это больше не работает в более поздних сборках Windows 10. База данных теперь содержит триггеры, которые запускают пользовательские функции, поэтому любое обновление завершается неудачно («Ошибка: нет такой функции: workid»), если загружаемое приложение не устанавливает необходимые функции.
Тим Сильвестр
@TimSylvester какое приложение вы хотите удалить? В 1903 году вы можете удалить больше приложений входящих.
magicandre1981
Привет, я знаю, что это довольно старое сейчас, но я просто взломал ноутбук, потому что он не будет обновляться, и выполнение этого процесса кажется смутно знакомым. Я не могу вспомнить, действительно ли я это делал, но есть ли способ определить, удалил ли я приложения, ограничивающие обновление (очевидно, в других системах)? В любом случае, где я могу проверить с помощью PDQ Inventory, чтобы я мог получить список уязвимых систем, и, наконец, если я переустановлю приложения, возобновятся ли будущие обновления? Или это спорный вопрос с последней версией Windows, потому что я считаю, что MS довольно глупо предотвращать обновления из-за чего-то такого глупого.
Джон Вайнрауб
@JonWeinraub в текущей версии Windows 10 вы можете официально удалить больше почтовых приложений. Так что вам это может не понадобиться
magicandre1981
4

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

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

harrymc
источник
Спасибо за Ваш ответ. Я пробовал скрипт в некоторых других системах, и он действительно работает почти для всех универсальных приложений, даже для некоторых, обычно не удаляемых, однако в проблемной системе проблема, к сожалению, сохраняется и скрипт не работает. Он показывает точно такие же сообщения об ошибках в PowerShell со всеми приложениями, которые я пытаюсь удалить.
Рякна
Если это все еще происходит, когда PowerShell вызывается с помощью «Запуск от имени администратора», то на этом компьютере что-то не так. Если это как проблема с магазином, попробуйте эти 5 советов, чтобы исправить проблемы магазина Windows и приложений в Windows 10 .
harrymc
@harrymc Это не работает с помощью$packageBase = "xboxapp", "officehub", "skypeapp"
JinSnow
2

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

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

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

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

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

Frostalf
источник
Спасибо за ваше время. Проблема в том, что этот образ Windows относится к ноябрю и еще не подключен к Интернету, поэтому не обновляется. Кроме того, я просто попытался удалить магазин и калькулятор из современной Windows 10 тем же способом и смог сделать это без проблем.
Рякна
@Ryakna А, хорошо, я оставлю свой ответ там, если кто-то захочет узнать альтернативные способы их удаления, лол
Frostalf
Я не могу переименовать SystemAppsпапку. Мне пришлось удалить папку приложения Xbox с помощью BleachBit, это было невозможно официальными средствами. Приложение Xbox все еще установлено, местоположение процесса Game Bar - ~\Windows\System32. Безопасно ли удалять GameBar*и GamePanel*файлы там?
user598527
@ user598527 Если вы не удалите приложение с помощью официальных средств (например, с помощью PowerShell) и просто удалите или переименуете папку, приложение на самом деле не удаляется и может вызвать проблемы в будущем. И вам не следует переименовывать SystemAppsпапку, так как это важно в Windows 10. К вашему сведению, папки универсальных приложений Windows предназначены C:\Windows\SystemAppsдля файлов системных приложений, C:\Program Files\WindowsAppsдругих файлов C:\Users\Ryakna\AppData\Local\Packagesприложений и данных приложений.
Рякна
1
@ user598527 Вы, вероятно, удалили некоторые из них (их много для Xbox AppX), но я думаю, что основная магистраль Xbox не удаляется. При запуске Get-AppxPackage | Select Name, PackageFullNameна PowerShell вы можете увидеть у вас еще есть Xbox AppX в вашей системе. Я думаю, что вы можете удалить игровую панель, если вы остановите и отключите службы Xbox (вероятно Xbox Live Networking Service)
Ryakna