Windows Security · 27 min read
Microsoft Store Is Installed, but One Protected File Says Access Denied: A Careful Recovery Guide
Most Microsoft Store launch problems are ordinary repair cases. This guide covers a narrower pattern: the package looks installed, common repairs do not help, and one protected executable has a damaged access-control list. Diagnose it first, avoid broad permission resets, and know when a targeted DACL recovery is appropriate.
Published by PrivWarden Team.
This is not the usual Microsoft Store problem
When Microsoft Store will not open, the sensible first assumption is that it is an ordinary application problem. The cache may need resetting, Windows may be waiting on an update, time or region settings may be wrong, or the app may offer a supported Repair or Reset option. Microsoft documents those as the starting point for normal Store launch failures. Microsoft Store support Repair apps in Windows
This guide is about a narrower and more serious-looking pattern. A Microsoft Store package can still appear installed while the Store does not launch, and a check of one executable inside its protected package directory returns Access Denied. In the confirmed pattern behind this guide, ordinary repair actions did not establish that the file’s access control was healthy. A carefully matched, one-file DACL correction later restored normal access.
That outcome does not mean that every Store error is an ACL problem, that everyone should change permissions inside WindowsApps, or that a package showing as installed proves that its files and security descriptor are intact. Treat this article as a diagnostic and decision guide. It is deliberately conservative because broad Windows permission changes can create lasting stability and security problems. Microsoft guidance
The exact pattern this guide covers
Do not jump from “Store will not open” to “repair a DACL.” The advanced section is only relevant when several observations line up. The table below separates the narrow pattern from more common failures.
· Observation · What it can mean · What it does not prove · · Microsoft Store is listed as installed · Package registration or inventory is present · Every packaged executable is readable or has the intended ACL · · Store does not launch · A launch, dependency, cache, policy, registration, or permission problem · A single-file DACL defect · · Cache reset or normal Repair did not help · The ordinary first-line route did not resolve the symptom · That broad permission changes are justified · · One protected Store executable returns access denied · A file-level permission or ownership condition deserves careful investigation · The rest of the package or the entire WindowsApps tree is damaged · · Multiple readable executables in the same package folder share one access-only descriptor · They may be useful evidence for a narrowly matched reference · That a descriptor from another package, another version, or the internet is safe to copy ·
Microsoft explains that changed file-system or registry permissions can stop Store apps from launching, and that missing access for ALL APPLICATION PACKAGES can be one cause. It also warns that extensive permission changes propagated through the file system or registry are hard to undo and can reduce application compatibility or stability. Microsoft guidance
The useful question is therefore specific: is there evidence of one damaged file descriptor, or is this a broader Windows, policy, registration, or application problem? If the answer is unclear, stop before changing permissions.
Start with the low-risk path
Begin with actions that Microsoft already documents for ordinary Store failures. Reset the Store cache with wsreset.exe, install pending Windows updates, and review time and region settings. If the app’s Advanced options expose Repair, use that before Reset; Reset can remove app data or return settings to defaults. Microsoft Store support Repair apps in Windows
If the problem began after a known change and a restore point from before that change exists, System Restore is another documented recovery decision. Microsoft says it can restore system files, registry settings, and installed programs to an earlier point without changing personal files. It can still remove later-installed programs, drivers, or updates, so use Scan for affected programs before choosing it. System Restore
These steps are not “weak” because they are simple. They are lower risk than modifying protected application permissions, and they address many Store launch failures that have nothing to do with a single executable. Keep a short record of what you tried and what changed. That record helps you avoid repeating actions and makes a later escalation more credible.
Why broad WindowsApps permission fixes are a bad fit
Search results often recommend taking ownership of the C:\Program Files\WindowsApps directory, granting Administrators or Everyone broad access, or running a recursive icacls /reset. Do not treat those suggestions as a repair for this pattern.
The protected package directory holds files with deliberately specific security descriptors, conditional permissions, and application-container expectations. A directory-wide ownership change or recursive ACL replacement touches far more than the one file under investigation. It can overwrite inheritance relationships, change the effective access of packaged apps, and make later troubleshooting harder because the original state is no longer visible.
Microsoft’s own warning is unusually direct: extensive DACL changes can affect application compatibility and stability, and propagated changes may not be reversible without rebuilding the operating system. The same article tells administrators to identify the changed locations and policy source rather than blindly resetting everything. Microsoft guidance
That gives this guide a firm boundary. Do not use this incident pattern to justify recursive ownership changes, broad Full Control grants, generic “fix WindowsApps” scripts, or package downloads from untrusted mirrors. A one-file observation requires a one-file investigation.
Understand what a DACL is changing
Every securable Windows object can have a security descriptor. That descriptor can include an owner, a discretionary access control list (DACL), a system access control list (SACL), and control bits. The DACL determines which users or groups are allowed or denied access; it is not the same thing as the owner and it is not a package-integrity check. Security descriptors
This distinction matters. A full descriptor clone can alter more than the problem you intended to repair. A safe advanced recovery aims to update only the target file’s DACL, leaving the owner, group, SACL, package payload, sibling files, and parent-directory permissions alone. It does not prove that the application is malware-free, reinstall a package, or repair unrelated Windows policy.
Microsoft documents SetNamedSecurityInfo as the current API for updating selected parts of a security descriptor. It requires WRITE_DAC access or ownership to set a DACL, and DACL changes can propagate inheritable ACEs depending on the object and flags used. Microsoft also marks the older SetFileSecurity API obsolete in favor of the named-security API. SetNamedSecurityInfo SetFileSecurity
For a protected executable, those details are a reason to slow down, not a reason to improvise. If you cannot explain exactly which file, which security component, which same-package reference, and which access right make the operation possible, do not perform it.
A disciplined diagnostic checklist
Before considering any targeted correction, collect enough evidence to reject the common alternatives. Run checks from an elevated PowerShell session only when you understand what they read. Do not paste their output publicly if it contains user names, device names, package paths, or unrelated installed software.
- Confirm that Microsoft Store is present through the normal package inventory, but do not treat a healthy-looking package status as a final verdict.
- Record the launch symptom and the result of low-risk repairs. A failed cache reset, Repair, or re-registration does not identify the cause by itself.
- Check whether the suspect file can be queried for its ACL. An access-denied result is a clue, not proof of malicious activity.
- In the same installed package folder, inspect two or more related, readable executable files. Compare their access-only security descriptor representation rather than their names or timestamps alone.
- Continue only if the readable siblings agree with each other, the target is the single outlier, and you can state why the reference belongs to the same package version and architecture.
- Check whether a managed-device policy could be reapplying permissions. Microsoft specifically recommends reviewing Group Policy when permission changes may be policy-driven. Microsoft guidance
The comparison step is important. A nearby executable is not automatically a safe reference. It must be from the same installed package folder, it must be readable, and more than one readable sibling should show the same access-only descriptor. If those checks disagree, stop. You have learned that the package has a more complex permission layout, not that one file should be forced to match another.
The narrow advanced recovery boundary
The following is an advanced, case-specific recovery pattern. It is not a standard Store troubleshooting command and should not be applied just because Store is broken. All of these conditions should be true before you proceed:
- The target is one known Microsoft Store executable in the currently installed package folder, not an arbitrary file under WindowsApps.
- The target’s ACL cannot be read, while multiple sibling executables in that exact folder are readable and return the same access-only descriptor.
- You have attempted the low-risk recovery path and recorded the results.
- You have a recovery plan, such as a known-good restore point or current backup, and you understand what System Restore could roll back.
- You have the necessary authority to set the target DACL without recursively changing its directory or taking ownership of unrelated files.
- You will save the reference descriptor privately before any write, then verify only the target file after the change.
In the successful case that informed this guide, the operator read the binary security descriptor from a healthy same-package sibling, saved a private backup, and asked the Windows security API to apply the DACL component only to the inaccessible target. The process then re-read the target ACL, checked it with icacls, re-registered only the existing Microsoft Store manifest, and launched Store for verification.
This is intentionally described as a process, not a promise. Microsoft’s API documentation says that a DACL update needs ownership or WRITE_DAC; a failed call must be treated as a stop condition, not a cue to add broad permissions. The older API used in the confirmed case can select the DACL portion of a descriptor, but Microsoft now recommends SetNamedSecurityInfo for new work. SetFileSecurity SetNamedSecurityInfo
What a safe implementation must and must not do
· A careful one-file procedure does · A procedure should not do · · Uses a readable reference from the same installed package folder · Downloads a replacement executable or ACL from a random website · · Compares more than one sibling before choosing a reference · Assumes every executable under WindowsApps should share one descriptor · · Backs up the reference descriptor privately before writing · Publishes a descriptor, device details, or personal path in a support post · · Requests the DACL component only for the single target · Resets the whole WindowsApps directory or inherited children · · Stops on an API error and preserves the error code · Adds Everyone, Administrators, or ALL APPLICATION PACKAGES Full Control as a shortcut · · Verifies the target ACL and Store launch afterward · Claims that an ACL change repairs package integrity, policy, or every Store issue ·
Do not use an advanced repair script if the target is not a Store file, if you cannot read the siblings, if their descriptors differ, if the operating system is managed by an organization, or if the symptom affects many unrelated applications. Those are escalation signals. A local administrator, enterprise support team, or Microsoft support channel can help review the wider configuration without turning one uncertainty into hundreds of changed ACLs.
A constrained DACL-only implementation
The following appendix records the narrowly targeted approach that informed this guide. It is included because a precise procedure can be safer than an improvised folder-wide reset, not because it is a general Microsoft Store repair. Do not run it if the diagnostic conditions above are not all met, if you cannot identify the current package folder, if more than one sibling behaves differently, or if Group Policy may be setting permissions.
Microsoft marks SetFileSecurity as obsolete and recommends SetNamedSecurityInfo for new work. This appendix therefore uses SetNamedSecurityInfo and passes only DACL_SECURITY_INFORMATION for one named file. It deliberately does not set an owner, group, SACL, recursive inheritance, PROTECTED_DACL, or UNPROTECTED_DACL flag. The last of those would explicitly make the target DACL inherit ACEs from its parent, which is a separate security-descriptor decision and is not justified merely by a launch failure. SetNamedSecurityInfo Security information flags
Before using it, create a restore point or confirm another recovery path, close Microsoft Store, and verify the exact same-package reference decision yourself. The backup produced below is a private record of the reference descriptor; it is not a backup of an unreadable target. If the target cannot be read before the change, there may be no practical way to capture its original DACL. That is a reason to stop unless you accept the recovery risk.
~~~powershell # Run in an elevated PowerShell session only after the diagnostic checklist matches. $ErrorActionPreference = 'Stop'
$Store = @(Get-AppxPackage -AllUsers Microsoft.WindowsStore · Sort-Object Version -Descending)[0] if (-not $Store) { throw 'Microsoft Store package was not found.' }
$Root = $Store.InstallLocation $Reference = Join-Path $Root 'store.exe' $Target = Join-Path $Root 'WinStore.App.exe' $Manifest = Join-Path $Root 'AppxManifest.xml' $Backup = Join-Path $env:USERPROFILE 'DesktopWinStore_Reference_DACL_Base64.txt'
if (-not (Test-Path -LiteralPath $Reference)) { throw 'The same-package reference executable was not found.' } if (-not (Test-Path -LiteralPath $Target)) { throw 'The target executable was not found.' } if (-not (Test-Path -LiteralPath $Manifest)) { throw 'The Store manifest was not found.' }
Save a private record of the readable same-package reference descriptor. $ReferenceAcl = Get-Acl -LiteralPath $Reference -ErrorAction Stop [Convert]::ToBase64String($ReferenceAcl.GetSecurityDescriptorBinaryForm()) | Set-Content -LiteralPath $Backup -Encoding ASCII -NoNewline
if (-not ('StoreDaclRepair.Native' -as [type])) { Add-Type -TypeDefinition @' using System; using System.Runtime.InteropServices; namespace StoreDaclRepair { public static class Native { [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern uint GetNamedSecurityInfoW( string name, uint objectType, uint securityInfo, out IntPtr owner, out IntPtr group, out IntPtr dacl, out IntPtr sacl, out IntPtr securityDescriptor);
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern uint SetNamedSecurityInfoW( string name, uint objectType, uint securityInfo, IntPtr owner, IntPtr group, IntPtr dacl, IntPtr sacl);
[DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr LocalFree(IntPtr memory);
public static uint CopyDacl(string referencePath, string targetPath) { IntPtr owner, group, dacl, sacl, descriptor; uint read = GetNamedSecurityInfoW(referencePath, 1, 4, out owner, out group, out dacl, out sacl, out descriptor); if (read != 0) return read; try { if (dacl == IntPtr.Zero) return 87; return SetNamedSecurityInfoW(targetPath, 1, 4, IntPtr.Zero, IntPtr.Zero, dacl, IntPtr.Zero); } finally { if (descriptor != IntPtr.Zero) LocalFree(descriptor); } } } } '@ }
1 = SE_FILE_OBJECT. 4 = DACL_SECURITY_INFORMATION. No inheritance-control flags are set. $Result = [StoreDaclRepair.Native]::CopyDacl($Reference, $Target) if ($Result -ne 0) { throw "SetNamedSecurityInfo failed with Win32 error $Result. No further steps were run." }
Verify the one changed target before package registration or launch. $TargetAcl = Get-Acl -LiteralPath $Target -ErrorAction Stop Write-Host "[OK] Target owner: $($TargetAcl.Owner)" -ForegroundColor Green Write-Host "[OK] Target SDDL: $($TargetAcl.Sddl)" -ForegroundColor Green icacls.exe "$Target" if ($LASTEXITCODE -ne 0) { throw "ACL verification failed: $LASTEXITCODE" }
Re-register only the existing Store package after the target is readable. Add-AppxPackage -DisableDevelopmentMode -Register $Manifest -ForceApplicationShutdown Start-Process 'ms-windows-store:' ~~~
This is an implementation for a single named file only. It does not take ownership, grant broad access, reset a directory, replace an executable, download a package, or modify another Store application. If the write call returns a nonzero Windows error, the target remains unreadable, or Store still does not launch, stop. Do not repeat the code against other files or turn it into a recursive repair.
Re-registration is a separate step, not proof of repair
Add-AppxPackage can register an existing package installation when it is given the package manifest and the relevant registration parameters. Microsoft documents this as package registration; it does not say that registration repairs an arbitrary existing file DACL. Add-AppxPackage
For this narrow pattern, re-registering after a verified DACL-only recovery is a reasonable final activation step. It is not evidence that re-registering before the access problem is resolved will fix the protected file. Keep the order clear: diagnose, decide whether the case truly matches, make the smallest defensible correction, verify that the file is readable, then re-register and test the app.
Verify the result without oversharing
Success should be boring and observable. The formerly inaccessible target ACL should now be readable. A file-level verification tool should return success for that target. Microsoft Store should open from its ordinary Start-menu or protocol route. If it does not, do not keep layering scripts on top of the first repair.
Keep a private record containing the date, the exact package family, the reference-file name, the target-file name, the precondition checks, the backup location of the descriptor, and the before/after verification results. Do not publish this record. A support post does not need your account name, device name, package version, backup path, event-log export, or complete application inventory to be useful.
If the Store opens after the DACL-only change, do not change the owner merely to make it “look normal.” The verified goal is functional access with the least changed security component. Changing additional fields after success creates a second unproven change.
When to stop and choose recovery instead
Stop the targeted path if any prerequisite fails, if an API call returns an error, if the same-package siblings do not agree, or if the target remains inaccessible after a carefully bounded attempt. Also stop if you find signs of broader file-system, registry, or policy changes. Microsoft’s documentation makes clear that these broader conditions may need a configuration review rather than a hand-built ACL repair. Microsoft guidance
At that point, choose a recovery option proportionate to the problem: review a restore point, use a supported Windows repair path, or seek support with a minimal reproduction of the symptom. A good escalation note says which low-risk steps were tried, that one protected target remained inaccessible, whether same-package sibling descriptors agreed, and what error code occurred. It does not need a public dump of private system information.
A better rule for Windows repair
The lesson is broader than Microsoft Store. When a protected application fails, the temptation is to take ownership of everything until the error disappears. That may produce a short-term change while making the system less understandable and less secure.
Prefer the opposite approach: identify the smallest object that is actually different, compare it against a trustworthy local reference, change only the security component you can justify, and verify the result before moving on. If the evidence does not support a narrow change, use a recovery path that is designed for broad change. This is slower than copying a dramatic command from a forum, but it gives you a real chance of ending with a system you still understand.