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.

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.

Appendix: 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)