BCUninstaller/Bulk-Crap-Uninstaller · warning · ArgumentException
Selected update is not uninstallable
Error message
Selected update is not uninstallable
What it means
ArgumentException thrown after the search when updates were found but none have IsUninstallable==true. Windows Update marks some updates as non-removable (e.g. servicing-stack, defender definitions, mandatory OS components); the tool refuses to uninstall anything it cannot safely remove, so it errors before touching the installer.
Source
Thrown at source/WinUpdateHelper/UpdateManager.cs:30
using WUApiLib;
namespace WinUpdateHelper
{
internal static class UpdateManager
{
public static void UninstallUpdate(string updateId)
{
Console.WriteLine("Scanning updates...");
var wuaSession = new UpdateSessionClass();
var wuaSearcher = wuaSession.CreateUpdateSearcher();
var wuaSearch =
wuaSearcher.Search($"Type='Software' and IsInstalled=1 and UpdateID='{updateId}' and IsPresent=1");
var updates = wuaSearch.Updates.OfType<IUpdate>().ToList();
if (!updates.Any())
throw new ArgumentException("Selected update was not found");
var uninstallable = updates.Where(x => x.IsUninstallable).ToList();
if (!uninstallable.Any())
throw new ArgumentException("Selected update is not uninstallable");
var wuaInstaller = wuaSession.CreateUpdateInstaller();
wuaInstaller.Updates = new UpdateCollectionClass();
foreach (var update in uninstallable)
wuaInstaller.Updates.Add(update);
Console.WriteLine("Uninstalling " + string.Join("; ", uninstallable.Select(x => x.Title)) + "...");
WaitForInstallerBusy(wuaInstaller);
var result = wuaInstaller.Uninstall();
WaitForInstallerBusy(wuaInstaller);
switch (result.ResultCode)
{
case OperationResultCode.orcNotStarted:
throw new ArgumentException("Selected update is not uninstallable");
case OperationResultCode.orcInProgress:
break;
case OperationResultCode.orcSucceeded:
View on GitHub (pinned to 608321de98)
Solutions
- Confirm via 'list' output that IsUninstallable is true for the target update before calling uninstall.
- If the update is genuinely non-uninstallable, use DISM or the appropriate OS path (e.g. 'dism /online /Remove-Package') only if you understand the consequences.
- Pick a different, uninstallable equivalent update if one exists.
Example fix
// before - assume every listed update is removable WinUpdateHelper.exe uninstall <id> // after - pre-filter on the listed IsUninstallable flag // (parse 'list' output, only uninstall where IsUninstallable=True)
Defensive patterns
Strategy: validation
Validate before calling
var u = SearchUpdate(updateId);
if (u == null || !u.IsUninstallable) throw new ArgumentException("Selected update is not uninstallable"); Type guard
bool IsUninstallable(string updateId)
{
var searcher = new UpdateSessionClass().CreateUpdateSearcher();
var r = searcher.Search($"Type='Software' and IsInstalled=1 and UpdateID='{updateId}' and IsPresent=1");
return r.Updates.OfType<IUpdate>().Any(x => x.IsUninstallable);
} Prevention
- Check the IsUninstallable field in 'list' output before attempting uninstall.
- Servicing-stack, definition, and policy-pinned updates are not removable via this tool.
- Pick an uninstallable equivalent update if one exists.
When it happens
Trigger: The UpdateID resolves to an installed update whose IsUninstallable property is false. The updates collection is non-empty but every member is flagged non-uninstallable.
Common situations: Attempting to remove a servicing-stack update, a cumulative update that is pinned, or a definition update that WU does not allow uninstalling. Group/family updates where only the parent matches the ID and it is non-removable. Policy (e.g. MDM/Intune) marking updates permanent.
Related errors
- Selected update was not found
- Update installer is busy
- Unknown HRESULT code: 0x{errorCode:X8}
- Multiple commands specified
- Unknown argument: {arg}
AI-assisted analysis of BCUninstaller/Bulk-Crap-Uninstaller@608321de98 (2026-08-13).
Data as JSON: /api/errors/71f6ef8da8d10fda.
Report an issue: GitHub.