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

  1. Confirm via 'list' output that IsUninstallable is true for the target update before calling uninstall.
  2. 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.
  3. 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

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


AI-assisted analysis of BCUninstaller/Bulk-Crap-Uninstaller@608321de98 (2026-08-13). Data as JSON: /api/errors/71f6ef8da8d10fda. Report an issue: GitHub.