You're staring at an error that makes zero sense unless you live in Windows security internals, and now some app, service, or install is dead in the water.
Here's the deal: STATUS_INVALID_LABEL (0xC0000446) means Windows tried to stick a security label on an object (a file, registry key, process, or token) using a Security ID that can't be used as a label. That's it. Simple to say, annoying to fix because the cause is almost always something upstream — a broken integrity level, a service account that got deleted, or a security descriptor from another machine.
The fast fix: reset the integrity label on the object
Before you do anything, open an elevated Command Prompt or PowerShell. If you can't elevate, stop reading and go find an admin account, because nothing below will work without it.
Find the file or folder throwing the error. Then run this:
icacls "C:\Path\To\Broken\Object" /setintegritylevel Medium
Replace Medium with Low or High depending on what the object actually needs. 90% of the time Medium is the answer. This overwrites the bad integrity label with a valid one.
If it's a registry key, it's the same idea but you use PowerShell:
$acl = Get-Acl "HKLM:\SOFTWARE\YourKey"
$rule = New-Object System.Security.AccessControl.RegistryAccessRule("BUILTIN\Users","ReadKey","Allow")
$acl.SetAccessRule($rule)
Set-Acl "HKLM:\SOFTWARE\YourKey" $acl
That doesn't fix integrity levels on registry keys directly — Windows is picky there — so if the registry key is the problem, export it, delete it, and reimport. That rebuilds the descriptor cleanly.
If it's a service that won't start with 0xC0000446, the label problem is usually on the service's SID. Check the service account first:
sc qc "YourServiceName"
If it's running as a custom account you created and that account no longer exists, recreate it or switch the service to NT AUTHORITY\LocalService or NT AUTHORITY\NetworkService. Then restart:
net stop YourServiceName
net start YourServiceName
Why that actually fixes it
Windows uses Mandatory Integrity Control to decide whether one process can write to another process's memory or modify certain objects. Every object has an integrity label — Low, Medium, High, or System — and the label is stored as a SID. The SIDs are predefined: S-1-16-4096 for Low, S-1-16-8192 for Medium, S-1-16-12288 for High, S-1-16-16384 for System.
When the label SID gets corrupted, or someone (or some installer) writes a SID that isn't one of those four, Windows throws 0xC0000446 the moment anything tries to use it. The kernel checks the label against a whitelist, and if it doesn't match, that's the status code. It's not a permissions problem — it's a format problem on the label itself.
Setting the integrity level with icacls rewrites those SID bytes with a canonical value, so the kernel check passes. Same story for service accounts: if the SID is orphaned, the label can't resolve and the token build fails. Replacing the account forces Windows to generate a valid SID, which generates a valid label.
Had a client last month whose entire print queue died with 0xC0000446. Turns out a Group Policy pushed a mandatory label policy with a typo in the SID. Every spooler process got a bad label. Fixing one GPO setting restored printing across 40 workstations. So if you see this on a domain machine, check GPO first.
Less common variations
1. Copying files from a domain-joined machine
If you copy a file from Machine A (domain-joined) to Machine B (workgroup), and the file has an integrity SID tied to a domain account, Machine B can't resolve it. Unblock the file and reset the label:
Unblock-File "C:\Path\file.exe"
icacls "C:\Path\file.exe" /setintegritylevel Medium
2. AppContainer / sandboxed apps (Edge, UWP)
UWP apps sometimes hit this when their AppContainer SID loses its label association. Reset the app:
Get-AppxPackage *AppName* | Reset-AppxPackage
Or nuke and reinstall it from the Store. Doing a full Get-AppxPackage | Remove-AppxPackage dance rarely helps here — target the specific app.
3. Backup software restoring stale ACLs
Veeam, Windows Backup, and Acronis all restore security descriptors verbatim. If the source machine had a bad label, the restore propagates it. After restoring, strip and reapply:
icacls "D:\Restored\Folder" /reset /T /C
Then reapply the intended permissions. Yes, this loses custom ACLs. That's the cost of a clean label.
4. Windows Server with mandatory label GPOs
If you're on Server 2016/2019/2022 and see this on services, check Computer Configuration → Windows Settings → Security Settings → Local Policies → Security Options → System objects: Strengthen default permissions of internal system objects. If that's enabled along with a custom SDDL, the label SID may be malformed. Disable it, run gpupdate /force, reboot.
Preventing this in the first place
- Don't hand-edit SDDL strings. Every 0xC0000446 I've seen on servers came from someone typing a custom SID into a security descriptor. Use
icaclsor the GUI. - Audit your GPOs quarterly. Mandatory label settings love to hide in GPOs that nobody remembers approving in 2019.
- Test service accounts after AD cleanup. If you delete a service account without checking what uses it, you're going to see this error within a week.
- Use robocopy with /COPY:DAT, not /COPYALL, for cross-domain file moves.
/COPYALLcopies the audit info including the integrity label, and that's exactly what breaks things. - Watch for backup software that restores ACLs verbatim. Set your restore profile to strip security descriptors when restoring to a different machine.
That's the whole game. It's a label format problem, not a permissions problem. Fix the label, and 0xC0000446 disappears. Fix the source of the bad label, and it stays gone.