HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows 11 WDACApp Control for BusinessAppLockerWindows 11IntuneApplication ControlCode IntegrityEndpoint Security

WDAC or AppLocker: which application control to actually deploy, and why running both is a trap

IA
Imran Awan
21 August 2026

Windows ships two application control stacks. Not one with two names. Two, with separate engines, separate policy stores, separate event logs and separate futures. One is App Control for Business, which most people still call WDAC. The other is AppLocker, which most people inherited from someone who left in 2016.

They overlap in purpose and differ in almost every mechanical detail. That combination is what produces the support ticket nobody can close: a file that one engine allows and the other blocks, with the block event sitting in a log channel nobody thought to open. This post explains what each stack actually enforces, at which layer, where its policy lives, which Event IDs it writes, and what Microsoft's own documentation says about choosing between them. Then it walks the audit-first path for whichever one you pick.

The short version

App Control for Business is enforced by the Code Integrity engine in ci.dll and needs no service; AppLocker is enforced by the appid.sys driver plus the Application Identity service, and stops enforcing the moment that service stops. Microsoft's documented position is that customers who can implement application control with App Control should do so, because AppLocker still gets security fixes but no new features. If both are active on the same device they act as independent gates, so a binary has to satisfy every enforced policy in both stacks, and each engine logs to its own channel without knowing the other exists. Deploy one in audit mode, read both event trees, and retire the other deliberately rather than leaving it running.

The problem: enforcement nobody can explain

The pattern is always the same. A team inherits an AppLocker policy from an old Group Policy Object. Somebody reads that App Control for Business is the strategic direction and deploys an App Control policy from Intune. Nobody removes the AppLocker rules, because nobody is certain what they still protect.

Now the device has two enforcement engines running at once. Three symptoms follow.

First, a line-of-business executable runs for one user and not another. That is a signature of AppLocker, because AppLocker rules carry a security identifier and can be scoped to a user or a group. App Control policies cannot: they apply to the managed computer as a whole and affect every user of the device.

Support then looks in the wrong log. App Control block events live in Microsoft-Windows-CodeIntegrity/Operational. AppLocker events live under a completely different tree with four sub-channels. If you only opened one of them, you concluded the block did not happen.

Second, a PowerShell script silently runs with fewer capabilities instead of failing. That is not a bug. It is App Control script enforcement handing the script host a verdict, and PowerShell responding by running the script in Constrained Language Mode rather than refusing outright.

Third, an App Control allow rule is added and the file still will not run. That is the part that breaks people's mental model. An allow rule in one stack does not override a deny in the other. The two stacks are not merged, ranked or reconciled anywhere.

Context: the naming has changed three times. The feature launched inside Device Guard and was called configurable code integrity. It became Windows Defender Application Control (WDAC). It is now App Control for Business. Microsoft states that the terms Device Guard and configurable code integrity are no longer used with App Control except when deploying policies through Group Policy - which is why the GPO node is still called Device Guard. Three names, one engine.

Why it happens: two engines, two layers, two log trees

To untangle a device you need to know what each stack is, mechanically, before you touch any policy. Start with plain English definitions, then follow the call chain.

What App Control for Business is

App Control for Business is a code integrity policy. You compile an XML policy into a binary and place it where the Windows Code Integrity engine reads it. That engine lives in C:\Windows\System32\ci.dll and it is part of the operating system's code loading path, not an add-on. There is no service to start. If an active policy exists, it is being evaluated.

Because it is a code integrity policy, it can cover kernel mode drivers as well as user mode applications. Microsoft designed it as a security feature under the Microsoft Security Response Center servicing criteria, which in practice means a documented bypass is treated as a security vulnerability.

App Control rules can be built from the code signing certificate, from signed file metadata such as original filename and version, from the file hash, from the file path, from the reputation of the app according to Microsoft's Intelligent Security Graph, from the identity of the process that installed the app (the managed installer), or from the process that launched the binary.

What AppLocker is

AppLocker is an access control mechanism layered on top of process creation, DLL loading and script host callbacks. Microsoft's architecture documentation is specific about the mechanism: AppLocker policies are conditional access control entries, evaluated using the attribute-based access control functions SeAccessCheckWithSecurityAttributes or AuthzAccessCheck.

There are three interception points, and understanding them explains every AppLocker symptom you will ever see:

  1. A new process is created. AppLocker calls the Application Identity component to calculate the attributes of the main executable, updates the new process token with those attributes, then checks the policy.
  2. A DLL is loaded. A notification goes to AppLocker, which duplicates the process token, swaps in the DLL's attributes, evaluates the policy, and discards the duplicate token. This is why DLL rules are expensive.
  3. A script is run. The script host - PowerShell, for example - calls AppLocker before running the file. AppLocker calls Application Identity in user mode to calculate file properties, then evaluates.

Every one of those paths depends on the Application Identity service. Microsoft's wording is blunt: stopping this service prevents AppLocker policies from being enforced. That single sentence explains most "AppLocker is not working" tickets.

Gotcha: AppLocker rules can exist and do nothing at all. The Application Identity service (AppIDSvc) ships set to manual start. If nothing starts it, your enforced rule collections are inert. Microsoft's own guidance is that when using Group Policy you must configure the service to start automatically in at least one GPO that applies AppLocker rules. Since Windows 10 the service is a protected process, so you can no longer set its startup type to Automatic in the Services snap-in - you need sc.exe config appidsvc start=auto or a security template. And Microsoft warns that the startup type cannot be set back to Manual with sc.exe, so take a backup before you change it.

What each one covers

AppLocker divides code into five rule collections, and the file extensions are documented exactly:

AppLocker rule collectionExtensions coveredNotes
Executable files.exe, .comThe collection almost everyone configures first.
Windows Installer files.msi, .mst, .mspCovers patches and transforms, not just installers.
Scripts.ps1, .bat, .cmd, .vbs, .jsEnforced by the script host calling AppLocker.
DLLs.dll, .ocxNot enabled by default. Microsoft warns it can cause performance problems on resource-constrained machines.
Packaged apps and installers.appxPublisher rules only. One rule governs install and run.

App Control is not organised by extension. It evaluates code as the loader encounters it, which is why its coverage includes kernel drivers that AppLocker cannot touch, and why a poorly built App Control policy can slow boot or prevent it. Microsoft explicitly recommends building on the supplied base templates so that Windows signers are trusted, because App Control evaluates all processes that run, including inbox Windows processes.

Microsoft's documented guidance on choosing

This is the part worth quoting rather than paraphrasing, because it settles most internal arguments. From the App Control and AppLocker overview: "Generally, customers who are able to implement application control using App Control, rather than AppLocker, should do so. App Control is undergoing continual improvements, and is getting added support from Microsoft management platforms. Although AppLocker continues to receive security fixes, it isn't getting new feature improvements."

That is the current support statement. AppLocker is not deprecated and not removed. It is in security-fix-only maintenance. The AppLocker overview page adds a second, sharper note: AppLocker "is a defense-in-depth security feature and not considered a defensible Windows security feature", and App Control "should be used when the goal is to provide robust protection against a threat".

Microsoft then names the two cases where AppLocker is still the better answer: a mixed Windows estate where you need the same controls on versions older than Windows 10, and shared computers where you need different policies for different users or groups.

On running both, the documentation is permissive but specific. "AppLocker can also be deployed as a complement to App Control to add user or group-specific rules for shared device scenarios... As a best practice, you should enforce App Control at the most restrictive level possible for your organization, and then you can use AppLocker to further fine-tune the restrictions."

Read that carefully. It sanctions AppLocker as a deliberate narrowing layer on top of an App Control baseline. It does not sanction two independently authored, independently owned allow-lists that were never designed together. That distinction is the whole difference between a supported design and the trap.

Why both-active behaves the way it does

There is no published precedence table between the two stacks, because there is no arbitration between them. Each is an independent gate on the same execution attempt. A file that fails either one does not run.

Microsoft documents the equivalent behaviour inside App Control, and it is the clearest available statement of the intersection model: "If two base policies exist on a device, an application must pass both policies for it to run." The design page states it as a rule - multiple base policies intersect, and only applications allowed by both run without generating block events. Supplemental policies are the opposite: a base plus its supplementals is a union.

Within a single App Control policy set, evaluation order is documented as well. Deny rules win first, then explicit allow rules, then managed installer or Intelligent Security Graph extended attributes, then reputation, and anything left over is blocked implicitly. That last line is the one that surprises people: an App Control policy is default-deny.

Gotcha: one event channel belongs to AppLocker but carries App Control verdicts. Microsoft documents that App Control generates events in two places: CodeIntegrity - Operational for executables, DLLs and drivers, and AppLocker - MSI and Script for MSI installers, scripts and COM objects. So an 8029 error in an AppLocker channel can be an App Control block, not an AppLocker block. Its message text even says "due to Config CI policy". If you triage by channel name alone you will blame the wrong stack. Note also that the AppLocker MSI and Script events are not included on Windows Server Core.

The binaries involved

Naming the actual files makes the two layers concrete.

FilePathRole in the flow
ci.dllC:\Windows\System32\ci.dllThe Code Integrity engine that evaluates App Control policies. Microsoft's known-issues page names it directly: before the April 2024 security update, exceeding 32 active policies bug-checks with 0x0000003b referencing ci.dll.
SiPolicy.p7bC:\Windows\System32\CodeIntegrity\SiPolicy.p7bSingle-policy format binary. Group Policy deployment converts whatever file you point it at into this name.
{PolicyId}.cipC:\Windows\System32\CodeIntegrity\CiPolicies\Active\Multiple-policy format binaries, one per policy, named for the <PolicyId> element in the XML.
appid.sysC:\Windows\System32\drivers\appid.sysThe AppLocker driver. Registered as the AppID service, and listed as a dependency of appidsvc.
applockerfltr.sysC:\Windows\System32\drivers\applockerfltr.sysThe AppLocker filter driver. Microsoft's managed installer troubleshooting steps require both appidsvc and AppLockerFltr to show as RUNNING.
appidtel.exeC:\Windows\System32\appidtel.exeConfigures the Application Identity service and filter driver. Documented invocation is appidtel.exe start [-mionly].
CiTool.exeC:\Windows\System32\CiTool.exeInbox App Control management tool, included from Windows 11 22H2 and Windows Server 2025.
Context: the two stacks are already entangled by design. Two App Control features - managed installer and the Intelligent Security Graph - are built on AppLocker. Managed installer "uses a special rule collection in AppLocker to designate binaries that are trusted", and Microsoft's troubleshooting steps for it start by confirming the AppLocker service and driver are running. So "we use App Control, we do not use AppLocker" is often untrue in practice. If you enabled managed installer, you deployed an AppLocker policy.

How to verify: prove which stack is actually enforcing

Before changing anything, establish ground truth. Every command below is read-only. Run them elevated - the Code Integrity channel, CiTool and the Device Guard WMI class all need administrator rights.

Step 1: ask the Code Integrity engine what it is enforcing

The Device Guard WMI class reports enforcement mode as a number. Kernel and user mode are reported separately, and that separation matters enormously.

PowerShell - run elevated
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard | Select-Object CodeIntegrityPolicyEnforcementStatus, UsermodeCodeIntegrityPolicyEnforcementStatus CodeIntegrityPolicyEnforcementStatus : 2 UsermodeCodeIntegrityPolicyEnforcementStatus : 0 # Documented values for both fields: 0 = Off, 1 = Audit, 2 = Enforced. # HEALTHY-BUT-MISREAD: kernel 2 with user mode 0 is the DEFAULT on Windows 11. # Kernel Enforced comes from the inbox Microsoft driver policy that every device # carries. It does NOT mean you have deployed application control. # ACTUALLY DEPLOYED: user mode 1 (audit) or 2 (enforced).

Step 2: list the App Control policies on the device

CiTool dumps every policy, active or not. The two fields that matter are IsEnforced and FriendlyName. Microsoft's own example filters on enforcement state.

PowerShell - run elevated
(CiTool -lp -json | ConvertFrom-Json).Policies | Where-Object { $_.IsEnforced -eq "True" } | Select-Object -Property PolicyID, FriendlyName | Format-List PolicyID : aaaaaaaa-0b0b-1c1c-2d2d-333333333333 FriendlyName : Microsoft Windows Driver Policy PolicyID : bbbbbbbb-0b0b-1c1c-2d2d-333333333333 FriendlyName : Microsoft Windows Endpoint Security Policy # Illustrative output, policy IDs replaced with placeholders. # HEALTHY BASELINE: only Microsoft inbox policy names appear here. # YOUR POLICY IS LIVE: a FriendlyName you chose appears with IsEnforced True. # If CiTool is missing you are on Windows 10 or 11 21H2 - fall back to event 3099.

You can corroborate that against the files on disk. Microsoft documents the policy file locations precisely, and the presence of the legacy filename is itself a finding.

C:\Windows\System32\CodeIntegrity\CiPolicies\Active\{PolicyId GUID}.cip
C:\Windows\System32\CodeIntegrity\SiPolicy.p7b
<EFI System Partition>\Microsoft\Boot\CiPolicies\Active\{PolicyId GUID}.cip
<EFI System Partition>\Microsoft\Boot\SiPolicy.p7b

Signed policies must be deployed into the EFI System Partition, which is why a signed policy survives an operating system reinstall and why removing one is a documented, careful procedure rather than a file delete.

Step 3: ask AppLocker what it is enforcing

The effective policy is the merged result of every AppLocker source that applies. If the object has zero rule collections, no AppLocker policy is in effect at all.

PowerShell - run elevated
$p = Get-AppLockerPolicy -Effective $p.RuleCollections | Select-Object RuleCollectionType, EnforcementMode, Count RuleCollectionType EnforcementMode Count ------------------ --------------- ----- Exe Enabled 14 Dll NotConfigured 1 Msi AuditOnly 3 # Enabled = blocking. AuditOnly = logging only, nothing blocked. # CLEAN DEVICE: RuleCollections.Count is 0 - no AppLocker policy applied. # DANGER: NotConfigured with rules present behaves as ENFORCED. That Dll row # with a single rule means every other DLL in that collection is blocked. Get-AppLockerPolicy -Effective -XML > "$env:USERPROFILE\Desktop\AppLocker.xml" # Microsoft's documented way to read the full merged policy for review.

Then confirm the enforcement machinery is actually running, because rules without the service are decoration.

PowerShell - run elevated
sc.exe query appidsvc sc.exe query AppLockerFltr # Microsoft's managed installer troubleshooting expects STATE : 4 RUNNING for both. # BROKEN: STATE : 1 STOPPED while enforced rule collections exist. Nothing is # being blocked, and your audit data is empty for the wrong reason. Get-ChildItem "$env:windir\System32\AppLocker" # AppCache.dat plus one *.AppLocker file per rule collection with rules. # For managed installer there should minimally be an .AppLocker file for each of # EXE, DLL and MANAGEDINSTALLER. Zero *.AppLocker files with a policy present # means the policy never converted - check event 8000.

Step 4: read the registry, both stores

AppLocker's policy store predates the current naming. In the registry the feature is still called Software Restriction Policies version 2. Parent key, stated once:

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\SrpV2
Subkey or valueWhat it holdsHow to read it
Exe, Dll, Msi, Script, AppxOne subkey per rule collection that has been configured.Subkey absent means that collection was never configured.
EnforcementMode under each collectionWhether that collection blocks or only audits.Compare against Get-AppLockerPolicy -Effective; they should agree.
Rule GUID subkeys under each collectionThe individual serialised rules.Read the XML through the cmdlet instead - it is far more legible.
The SrpV2 key itselfPresence is the fastest yes/no answer.Key absent means no AppLocker policy has ever applied to this device.

App Control's own state lives under the Code Integrity control key. Only one value here is documented, and it is a diagnostic switch:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI
Value or subkeyPurposeStatus
TestFlags (REG_DWORD)Set to 0x300 and reboot to turn on managed installer and Intelligent Security Graph diagnostic events 3090, 3091 and 3092.Documented by Microsoft.
Config, Policy, State subkeysPresent on a live Windows 11 device and clearly related to Code Integrity state.Observed and undocumented. Do not build detection logic on these - undocumented values can change in any update.
HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuardVirtualisation-based security and memory integrity configuration, including EnableVirtualizationBasedSecurity and the Scenarios\HypervisorEnforcedCodeIntegrity subkey.Documented. Related to App Control but not the same thing.
Registry Editor
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\SrpV2
Name: (Default)   Type: REG_SZ   Data: (value not set)
Keys: Appx   Dll   Exe   Msi   Script
Illustrative. On a device with no AppLocker policy the SrpV2 key does not exist at all,
and Registry Editor reports that the specified key could not be found.

Step 5: read both event trees

This is the step that resolves the "allowed by one, blocked by the other" ticket. There are two channel families. State each once, then map the IDs.

Applications and Services Logs > Microsoft > Windows > CodeIntegrity > Operational
Channel name: Microsoft-Windows-CodeIntegrity/Operational
Event IDMeaningMode
3076The main App Control block event for audit mode. The file would have been blocked if the policy were enforced.Audit
3077The main App Control block event for enforced policies. The file did not pass and was blocked.Enforced
3089Signature information for a blocked or audit-blocked file. One event per signature; correlate by Correlation ActivityID.Both
3033 / 3034Signature revoked, or a Lifetime Signing certificate expired. 3034 is the audit equivalent.Both
3064 / 3065A user mode DLL failed the policy. 3064 is audit, 3065 is enforced.Both
3090 / 3091 / 3092Allowed purely by managed installer or reputation (3090), no such authorisation in audit mode (3091), enforced equivalent (3092).Both
3099A policy has been loaded. The event details include the policy options - the single most useful event on the device.Both
3101 / 3102 / 3103Policy refresh started, finished, or was ignored for N policies.Both
3095 / 3097The policy cannot be refreshed and needs a reboot (3095), or cannot be refreshed at all (3097).Both
Applications and Services Logs > Microsoft > Windows > AppLocker
Channels: Microsoft-Windows-AppLocker/EXE and DLL | /MSI and Script | /Packaged app-Deployment | /Packaged app-Execution
Event IDMeaningWhich stack
8000AppID policy conversion failed. The policy was not applied correctly to the computer.AppLocker
8001The AppLocker policy was applied successfully to this computer.AppLocker
8002 / 8003 / 8004EXE or DLL allowed / allowed but would have been prevented if enforced / prevented from running.AppLocker
8005 / 8006 / 8007Script or MSI allowed / audited / prevented from running.AppLocker
8008AppLocker component not available on this SKU.AppLocker
8020 - 8025Packaged app allowed, audited, prevented from running, or allowed to be installed.AppLocker
8027No packaged apps can execute while EXE rules are enforced and no packaged app rules are configured.AppLocker
8028 / 8029A script host asked App Control about a file: audited (8028) or blocked due to Config CI policy (8029).App Control
8036 / 8037COM object blocked by Config CI policy (8036), or the file passed the App Control policy (8037).App Control
8038Signature information correlated with an 8028 or 8029 event, one per signature.App Control
8039 / 8040Packaged app allowed to install in audit mode (8039), or prevented by Config CI policy (8040).App Control
8030 - 8035Managed installer check succeeded or failed during AppID verification.Shared plumbing
Event Viewer
Applications and Services Logs > Microsoft > Windows > AppLocker > MSI and Script
Level: Error   Event ID: 8029   Source: AppLocker
General: C:\Users\user\Downloads\install-helper.ps1 was prevented from running due to Config CI policy.
Read this correctly: the channel says AppLocker, the message says Config CI.
This is an App Control block, logged in an AppLocker channel. Illustrative.
Tip: turn the AppLocker EXE and DLL log volume down before you turn auditing on. Microsoft states the AppLocker event logs are very verbose, particularly EXE and DLL, and recommends that if you forward events to a service such as Log Analytics you collect only Error events from that log or stop collecting from it altogether. The Intune managed installer documentation repeats the warning with a cost angle, because enabling managed installer deploys an AppLocker policy and increases event volume.

Step 6: the scheduled task and the log files

AppLocker has exactly one documented scheduled task, and it is on-demand rather than periodic. The AppLocker overview's baseline settings table states: "Appidpolicyconverter.exe is put in a scheduled task to be run on demand." That converter is what turns a deployed policy into the *.AppLocker cache files under C:\Windows\System32\AppLocker. If those files are missing while a policy exists, the conversion is where to look, and event 8000 is the matching failure signal.

App Control has no equivalent task and no text log file. Its policy binaries are the state, and the Operational channel is the log. That is genuinely a point of asymmetry between the stacks, and it is worth saying out loud: there is no App Control log file to tail. If you want file-level authorisation evidence rather than block events, Microsoft's documented route is fsutil.exe file queryEA against a file, looking for the $KERNEL.SMARTLOCKER.ORIGINCLAIM extended attribute that managed installer and the Intelligent Security Graph write.

The fix: pick one, audit first, retire the other

The decision follows directly from the documented guidance. Two questions decide it.

  1. Do you need per-user or per-group application rules on shared devices? If yes, AppLocker is the only stack that can express them, because App Control applies to the whole computer. If no, App Control alone is sufficient.
  2. Do you still manage Windows versions older than Windows 10? If yes, AppLocker gives you one policy across the estate. If no, that argument is gone.

Two noes means deploy App Control and retire AppLocker. Any yes means you have a legitimate reason to keep AppLocker - but keep it as the documented narrowing layer on top of an App Control baseline, authored by the same people, in the same change, with both audit trails reviewed together.

Deploy App Control in audit mode from Intune

Intune's App Control for Business policies use the ApplicationControl configuration service provider. Microsoft states this CSP was introduced to replace the AppLocker CSP, and that while the AppLocker CSP is still supported, no new features are being added to it and development continues through ApplicationControl.

intune.microsoft.comEndpoint securityApp Control for BusinessCreate Policy
  1. Sign in to the Microsoft Intune admin center.
  2. Go to Endpoint security and select App Control for Business.
  3. Select the App Control for Business tab, then Create Policy. The platform type is assigned automatically.
  4. On Basics, enter a name and a description you will recognise in a report six months from now.
  5. On Configuration settings, choose a Configuration settings format. Built-in controls is the simplest path; Enter xml data takes a policy you authored yourself.
  6. With built-in controls, set Enable trust of Windows components and store apps to Audit only. This is the whole point of the first deployment: events are logged in the local client logs but apps are not blocked.
  7. Under Select additional options for trusting apps, choose Trust apps from managed installers and/or Trust apps with a good reputation as your design requires.
  8. On Scope tags, apply your scope tags, then Next.
  9. On Assignments, target device groups. App Control policies apply to the device scope only, so a user group will only affect the devices inside it.
  10. On Review + create, select Create.

If you want Intune-deployed apps trusted automatically, the managed installer policy is a separate tab in the same node.

intune.microsoft.comEndpoint securityApp Control for BusinessManaged installerCreate
  1. Select the Managed installer tab, then Create.
  2. Name the policy on Basics.
  3. On Settings, set Enable Intune Managed Extension as Managed Installer to Enabled, which is the default.
  4. Apply scope tags, then include or exclude device groups on Assignments.
  5. Review + create. Allow up to ten minutes for the policy to appear and up to thirty for devices to receive it.
Destructive risk: enabling managed installer merges an AppLocker policy, and a bad merge can stop the device booting. Microsoft's warning is explicit. Enabling managed installer via Intune deploys an AppLocker policy containing a dummy rule which is merged with whatever AppLocker policy the device already has. If the existing policy has a rule collection defined as NotConfigured with an empty rule set, it merges as NotConfigured with the dummy rule - and a NotConfigured collection defaults to enforced once any rule exists in it. With the dummy rule as the only rule, everything else in that collection is blocked. Microsoft names the consequences: applications failing to start, and failure to boot or sign in to Windows. The documented mitigation is to remove any NotConfigured rule collection with an empty rule set from your existing AppLocker policy first. Microsoft also notes managed installers can enable stopped or disabled AppLocker policies enforced from Group Policy. Audit your inherited AppLocker XML before you tick that box.

Deploy App Control from Group Policy, and know the limitation

The GPO route exists, but it is deliberately constrained.

gpmc.mscComputer ConfigurationAdministrative TemplatesSystemDevice GuardDeploy App Control for Business
  1. On a machine with the Remote Server Administration Tools installed, run GPMC.MSC.
  2. Right-click the target organisational unit and choose Create a GPO in this domain, and Link it here. Name it.
  3. Right-click the new GPO and choose Edit to open the Group Policy Management Editor.
  4. Navigate to Computer Configuration\Administrative Templates\System\Device Guard.
  5. Right-click Deploy App Control for Business and choose Edit.
  6. Select Enabled and specify the local path or the UNC path where clients will fetch the policy binary.
  7. Close the editor and restart a test machine. Restarting is what updates the policy.
Gotcha: Group Policy only supports single-policy format App Control policies. Microsoft's guidance is explicit - GPO-based deployment supports single-policy format only, and for Windows 10 1903 and later or Windows 11 an alternative deployment method is recommended. Whatever filename you point the setting at is converted to SiPolicy.p7b on the client. Separately, WMI and Group Policy do not support multiple policies at all, so admins who cannot reach the MDM stack are pointed at the ApplicationControl CSP through the MDM Bridge WMI provider instead. And for new signed base policies on machines running memory integrity, Microsoft says to deploy by script and activate with a restart rather than using Group Policy.

Deploy AppLocker in audit mode

AppLocker's own console path is a different branch of the policy tree entirely - Windows Settings, not Administrative Templates.

gpmc.mscComputer ConfigurationWindows SettingsSecurity SettingsApplication Control PoliciesAppLocker
  1. For a single machine open secpol.msc; for a group of machines edit a GPO in the Group Policy Management Console.
  2. Expand Application Control Policies and select AppLocker.
  3. Right-click AppLocker and choose Properties.
  4. On the Enforcement tab, tick Configured for the rule collection you want, then select Audit only in that collection's list.
  5. Repeat for each collection you intend to control, then select OK.
  6. In the same GPO, go to Computer Configuration\Windows Settings\Security Settings\System Services, double-click Application Identity, and configure it to start automatically. Without this the rules will never be evaluated.

Rules themselves are created per collection through the wizard, and can also be generated with the AppLocker cmdlets:

CmdletWhat it doesUse it for
Get-AppLockerFileInformationRetrieves AppLocker file information from a list of files or from an event log, including publisher, hash and path.Turning audit events into candidate rules.
New-AppLockerPolicyGenerates rules for a given user or group from a list of file information, by publisher, hash or path.Building a policy from an inventory pass.
Get-AppLockerPolicyGets the policy from the local GPO, a specified GPO, or the effective policy on the device.Auditing what is actually in force.
Test-AppLockerPolicyTests whether a list of files would be allowed to run for a specific user under a given policy.Pre-flighting a change without deploying it.
Set-AppLockerPolicySets the specified GPO to contain the specified policy. Not read-only.Deployment only. Never in a diagnostic script.

Intune and AppLocker: there is no settings catalog path

This is worth stating plainly because people search for it and do not find it. Intune has a first-class node for App Control for Business under Endpoint security. It has no equivalent modern node for AppLocker rules. AppLocker from Intune means the AppLocker CSP, and the CSP's own node structure is where you author it:

./Vendor/MSFT/AppLocker/ApplicationLaunchRestrictions/{Grouping}/EXE/Policy
./Vendor/MSFT/AppLocker/ApplicationLaunchRestrictions/{Grouping}/EXE/EnforcementMode

Sibling nodes exist for DLL, MSI, Script, StoreApps and CodeIntegrity. Microsoft's guidance on the {Grouping} segment is that the value should include some randomness and that the best practice is a randomly generated GUID, to avoid problems on unenrollment. Note also that applying or deleting a policy through the CodeIntegrity/Policy node under this CSP schedules a reboot.

Gotcha: the old Intune Application control profile is not the same feature. Microsoft documents that Intune's Attack surface reduction policies use the AppLocker CSP for their Application control profiles, while App Control for Business policies use the ApplicationControl CSP - and that the Application Control instances under Attack Surface Reduction or under Devices > Configuration will be deprecated in a future release. If you find an Application control profile in your tenant, you have an AppLocker deployment that nobody described as one.

Retire the loser deliberately

Neither stack should be switched off by deleting files. Both have documented removal paths, and both can leave a device blocking things after the policy is "gone".

To remove App Control enforcement, Microsoft's documented sequence is to first replace the existing policy with a version that allows everything - the example policy shipped on every device at %windir%\schemas\CodeIntegrity\ExamplePolicies\AllowAll.xml - deploy that, and only then delete the policy from Intune. Policies deleted from the Intune interface are removed from the device but stay in effect until the next reboot, so deleting first and allowing second leaves a window where the device is enforcing a policy you can no longer edit.

To remove AppLocker, the documented route is to clear the policy rather than edit around it. Microsoft also publishes two scripts for the managed installer case specifically: CatCleanIMEOnly.ps1, which removes only the Intune Management Extension as a managed installer, and CatCleanAll.ps1, which removes all AppLocker-based policies from the device. Read that second name twice before you run it.

Destructive risk: unenrolling or stripping policies can cause boot stop failures. Microsoft's own warning, on the Intune App Control page, is to read the guidance on removing App Control policies causing boot stop failures before unenrolling a device that received App Control policies or removing those policies from it. Signed policies are the sharp edge, because they are deployed into the EFI System Partition and a signed policy that cannot be replaced by an unsigned one is a recovery scenario, not a configuration change. Test the removal path in a lab on a machine you are willing to reimage.

Proof it worked: a real posture report

Reading eight surfaces by hand on every device does not scale, so there is a companion script for this post that reads all of them and states a verdict. It is read-only: no Set, New, Remove, Enable or Disable against any device setting, service or registry value. It requires no PowerShell module. It aborts with exit code 1 if any read fails, rather than printing a clean result that would be a lie.

github.comImran76Awan/Windows-11-Scriptswdac-vs-applocker-which-one-to-deployGet-AppControlPosture.ps1

What follows is a genuine run on a managed Windows 11 Enterprise device, with identifiers replaced. Every value below was read live.

PowerShell - run elevated
.\Get-AppControlPosture.ps1 -EventDays 7 Operating system : Microsoft Windows 11 Enterprise build 10.0.26200 PowerShell edition : 5.1.26100.9168 (Desktop) ==== Stack 1 of 2: App Control for Business (WDAC), enforced by ci.dll ==== Kernel code integrity policy : Enforced (2) User mode code integrity (UMCI) : Off (0) Multiple-policy binaries (.cip) : 8 in CiPolicies\Active Single-policy binary : SiPolicy.p7b not present Policies known to Code Integrity : 14 Policies currently enforced : 4 Custom (your own) policies : none -- only Microsoft inbox policies found ==== Stack 2 of 2: AppLocker, enforced by appid.sys plus AppIDSvc ==== SrpV2 policy store : absent -- no AppLocker policy has been applied Effective rule collections : 0 -- no AppLocker rules in effect AppIDSvc (Application Identity) : Stopped, start=Manual AppLockerFltr driver : Stopped, start=Manual appid driver : Stopped, start=Manual appid.sys on disk : present AppLocker\AppCache.dat : present *.AppLocker cache files : 0 # Read this as: fourteen policies exist, four are enforced, none are yours. # All four enforced policies are Microsoft inbox policies - the driver policy, # the VBS policy and so on. That is why kernel shows Enforced and UMCI shows Off.

The event pass and verdict from the same run:

PowerShell - run elevated
==== Event evidence, last 7 day(s) ==== CI audit blocks (3076) : 0 CI enforced blocks (3077) : 0 CI policy loaded (3099) : 56 AppLocker EXE/DLL audit (8003) : 0 AppLocker EXE/DLL block (8004) : 0 AppLocker MSI/Script audit (8006) : 0 AppLocker MSI/Script block (8007) : 0 CI script audit (8028) : 0 CI script block (8029) : 0 AppLocker policy applied (8001) : 0 AppLocker conversion fail (8000) : 0 ==== Verdict ==== App Control (WDAC) gating apps : False AppLocker policy present : False AppLocker actively blocking : False Neither stack is gating applications on this device. All reads succeeded. # 56 x event 3099 with zero 3076 and zero 3077 is the signature of a device # running only inbox policies: policies load on every boot and refresh, and # nothing is ever blocked or audited against them. # BOTH-ACTIVE would instead show a custom policy name with ENFORCED, plus a # non-zero SrpV2 collection count, and the script prints the red both-stacks # warning explaining that a binary must satisfy every enforced policy in both.
Tip: run it with -EventDays 0 -Quiet across the fleet first. That skips the event log pass entirely, which is the slow part on any device with a populated AppLocker EXE and DLL log, and drops the explanatory prose. You get the policy and service posture in a few seconds per device, which is enough to answer the only question that matters at the start of a migration: how many of my machines have two stacks live at once? Then run the full version, with events, on the ones that come back flagged.

What the report gives you that a single command does not is the join. Kernel enforced with user mode off, fourteen policies of which none are yours, an AppLocker service stopped with no policy behind it: individually each of those readings is easy to misinterpret, and three of them are routinely quoted as evidence that application control is deployed when it is not.

References

Community deep-dives that verify against the same documentation:

AuthorPostWhy it is worth reading
Peter van der WoudeAnalyzing Windows Defender Application Control events in audit modeWorks event 3076 in CodeIntegrity/Operational and event 8028 in AppLocker/MSI and Script into collected queries - exactly the two-channel problem this post describes.
Anders Ahl, MSEndpointMgrApplication Control on the Windows Platform - Architecture, Benefits, and RisksSets AppLocker and App Control in their historical lineage and is candid about the administrative overhead that kills application control projects.
PowerShell — companion script

Download it from Imran76Awan/Windows-11-Scripts — no sign-in required. It is read-only: it reports and never changes a device or anything in Intune. Validate it in your own environment before relying on the output.

Get-AppControlPosture.ps1 — Reports which Windows application control stacks are actually active on this device:
View all scripts on GitHub
Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Windows 11
Smart App Control: the Windows 11 security feature you cannot…
Smart App Control blocks unsigned and unknown code using the same engine as App Control…
Windows 11
Quick Assist vs Remote Help: the free one is a…
Quick Assist ships on every Windows 11 device and authorises a full remote-control…
Windows 11
Attack Surface Reduction rules broke a line-of-business app:…
An ASR rule in Block mode kills an app and tells you nothing but a GUID. Here is the…