HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links★ Pro Subscribe free
← Back to Blog
Group Policy Group PolicyAdministrative TemplatesGroup Policy PreferencesWindows Hello for BusinessIntuneRegistryTroubleshooting

GPO Tattooing Myth: Administrative Templates, Not Configured and Live Policy

IA
Imran Awan
31 October 2026

"The old GPO tattooed the registry." I wrote that diagnosis myself, on one enterprise laptop, and it was wrong. The value was not stranded. A different Group Policy Object (GPO), still applying, was writing it back at every refresh.

Tattooing is real, but it is narrower than most people think. Microsoft documents which kinds of Group Policy settings stay behind and which are removed. Administrative Template settings, the ones most of us mean when we say "the GPO", are in the second group. If one of them is still on a device, the first suspect is a GPO that still applies, not a dead one.

The short version

Administrative Template settings are written under the Policies registry keys. Microsoft says these trees are cleaned and rewritten when Group Policy changes, so they do not cause persistent settings once the GPO is no longer in effect. Group Policy Preferences are different: by default they stay behind. So a value under HKLM\SOFTWARE\Policies that survives a deny usually means another GPO still sets it. To retire one setting, set it to Not Configured in the GPO that carries it, while that GPO keeps applying. Deleting the value by hand is temporary.

The problem: a value that "should have gone"

The project was moving Windows Hello for Business settings from Group Policy to Intune. The Intune profile set a minimum PIN length. One laptop accepted a shorter PIN than Intune asked for.

The registry explained why. A Group Policy copy of MinimumPINLength was on the device. For Windows Hello, Group Policy wins over Intune, so the Group Policy value was the one in force.

The team had already denied the Windows Hello GPO for this laptop. So the story wrote itself: the GPO was denied, its value was left behind, the registry was "tattooed". The obvious fix was to delete the value.

This is what the read looked like. The names and numbers are fictional, but the shape is the same as on the real device:

PowerShell - read-only, illustrative values
# The Group Policy copy of the Hello PIN rules Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\PassportForWork\PINComplexity' | Select-Object MinimumPINLength MinimumPINLength ---------------- 7 # What the team believed: # "Contoso - Windows Hello" GPO : denied for this device # Intune profile : MinimumPINLength = 10 # Conclusion : the denied GPO left 7 behind

Illustrative. On the laptop I examined, the value sat in a PINComplexity subkey under HKLM\SOFTWARE\Policies\Microsoft\PassportForWork. The GPO names and PIN lengths here are invented.

Two facts broke the story. First, the denied GPO never set a PIN length at all. It carried the rest of the Hello settings, but not that one. Second, the value came from a general workstation GPO, here called "Contoso - Workstation Baseline". That GPO carried one Hello setting among many unrelated ones, and it was still applying at every refresh.

So the value was not stranded. It was live policy. Deleting it bought a short window at best, and any "after" evidence gathered in that window meant nothing.

📋 Note: Microsoft uses the word too. "Tattoo" is not only community slang. The Group Policy team's own blog, now archived on Microsoft Learn, says Group Policy policy settings will "not tattoo", and that preference settings will "tattoo". It is the plainest Microsoft definition of the word I found.

Why it happens: what tattooing really is, and what it is not

Tattooing means a setting stays on a device after the thing that set it no longer applies. Whether that can happen depends on what kind of setting it is and where it is written. There are three kinds to tell apart.

1. Administrative Template settings: removed by design

Administrative Templates are the registry-based part of Group Policy. Microsoft's page on editing them says it directly: "Administrative Template policy settings are also known as registry-based policy settings."

Microsoft's Administrative Templates overview explains where these "true policies" live: "The registry information for true policies is located under \Software\Policies or under \Software\Microsoft\Windows\CurrentVersion\Policies in the HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE hives."

It then gives the removal behaviour. One of the stated advantages of those keys is: "When Group Policy changes, for any reason, these trees are cleaned, and the new policies are then rewritten." And the conclusion: "they will not cause persistent settings in the registry when the GPO that applies to them is no longer in effect."

The archived Group Policy team post says the same in plainer words. Policy settings will "not tattoo. In other words, when a Group Policy object (GPO) goes out of scope, the policy setting is removed allowing the original configuration value to be used."

Be clear about the age of these sources. The overview is a Windows Server 2003 page and the blog post is from 2008. Both are still published on Microsoft Learn. I did not find a newer Microsoft page that restates the removal rule in these words, and I found none that contradicts it.

2. Group Policy Preferences: they stay unless you say otherwise

Group Policy Preferences (GPP) are a separate set of client-side extensions. One of them, Group Policy Registry, can "Create, replace, or delete registry settings". It writes the key and value its author names in the item, and it is not one of the fixed template locations described above.

Microsoft's current Group Policy preferences page states the default: "By default, Group Policy Preferences don't remove settings when a Group Policy Object (GPO) no longer applies to a user or computer."

The opt-out is a check box on the item's Common tab. Selecting Remove this item when it is no longer applied changes the behaviour: "if the preference item falls out of scope, due to item-level targeting or GPO changes, the settings previously applied by that item are removed." Microsoft adds that the option "automatically sets the action to Replace".

3. Anything else that writes the registry

Scripts, installers and manual edits are not Group Policy at all. Group Policy does not clean up after them. The old Administrative Templates page calls settings stored outside the Policies trees preferences, and says they behave the way Windows NT 4.0 System Policies did: they remained "until the value was reversed, either by a counteracting policy or by editing the registry."

Put together:

What wrote the valueWhere it is writtenWhen its GPO stops applying
Administrative Template settingSoftware\Policies or Software\Microsoft\Windows\CurrentVersion\PoliciesRemoved. Microsoft: these trees are "cleaned" when Group Policy changes.
GPP item, default optionsThe key and value the item namesStays. This is real tattooing.
GPP item with Remove this item when it is no longer appliedThe key and value the item namesRemoved.
Script, installer or manual editAnywhereNot Group Policy. Nothing removes it.

The case in this post sits in the first row. The value was under HKLM\SOFTWARE\Policies, written by an Administrative Template setting. By Microsoft's own rules, if no applying GPO set it, it should have been cleaned. It was still there because a GPO still set it.

Enabled, Disabled and Not Configured

Every Administrative Template setting has three states. Microsoft's page on editing them defines each one by what it does to the registry:

StateMicrosoft's definitionWhat it means for retiring a setting
Not Configured"The registry is not modified."The GPO no longer carries the setting. At the next processing the Policies tree is cleaned and rewritten without it.
Enabled"The registry reflects that the policy setting is selected."The GPO enforces the setting with its value.
Disabled"The registry reflects that the policy setting is not selected."Still a configured state. The GPO still has an instruction for this setting.

For Minimum PIN length, Disabled and Not Configured give the user the same PIN rule. Microsoft's Windows Hello policy reference says: "If you disable or don't configure this policy setting, the PIN length must be greater than or equal to 6."

But the PIN rule is not the only thing that matters during a migration. What matters is whether Group Policy is still configuring the setting. Microsoft's Windows Hello configuration page says: "If you mix GPO and CSP policy settings, the conflicting CSP settings aren't applied until the group policy settings are cleared." Disabled is still a configured state, so it is not cleared. Not Configured is the state that leaves the registry alone.

⚠ Gotcha: MDMWinsOverGP does not help here. Many teams expect the MDMWinsOverGP setting to let Intune win. Microsoft says it "doesn't apply to Windows Hello for Business", because it "only applies to policies in the Policy CSP, while the Windows Hello for Business policies are in the PassportForWork CSP." For Hello, a GPO value on the device beats Intune for that setting.

Why the GPO's name misled everyone

A GPO's name is a label someone typed. It says nothing reliable about what the GPO contains. In this project, everybody looked at the GPO called "Windows Hello" because that was where Hello settings were expected. The one setting that mattered was in a baseline GPO nobody associated with Hello.

The lesson: look for the setting, not the policy. Search every GPO's settings for the value you see on the device. The companion post Find which GPO sets a registry value walks through that search.

How to verify: live policy or leftover?

Every check here only reads. Don't delete anything yet: the value on the device is your evidence.

Check 1: where is the value?

The registry path tells you which row of the table you are in. For Windows Hello, Microsoft documents two different parents, and they look confusingly alike:

HKLM\SOFTWARE\Policies\Microsoft\PassportForWork   (Group Policy)
HKLM\SOFTWARE\Microsoft\Policies\PassportForWork\<Tenant-ID>\Device\Policies   (CSP, for example Intune)

Check 2: which GPOs applied at the last refresh?

The Group Policy operational log records policy processing. Microsoft's troubleshooting guidance says: "Events in this log include the list of applied GPOs and a list of denied GPOs that includes the reasons for the denials." The log name is Microsoft-Windows-GroupPolicy/Operational.

This reads the newest events from that log:

PowerShell - read-only
# Newest Group Policy events first. Read, never clear. Get-WinEvent -LogName 'Microsoft-Windows-GroupPolicy/Operational' -MaxEvents 50 | Select-Object TimeCreated, Id, Message

Good looks like this: the GPO you denied is in the denied list, or in neither list, and you can name another GPO in the applied list that carries the setting. Bad looks like this: you cannot name any applied GPO that sets the value. Then a Preferences item, a script or a local policy is the next suspect. The companion post Find which GPO sets a registry value shows how to read the applied and filtered lists in detail.

Check 3: compare two times

This is the check that settles it. Every registry key has a last write time. Microsoft's RegQueryInfoKey documentation says it records "the last time that the key or any of its value entries is modified." Note that the time belongs to the key, not to one value.

Compare that time with the time of the last Group Policy refresh:

Live policy or leftover - illustrative
# Refresh 1 Group Policy refresh (computer) : 14/10/2026 09:12:41 PINComplexity key last written : 14/10/2026 09:12:46 <-- 5 seconds later # Refresh 2 Group Policy refresh (computer) : 14/10/2026 11:04:19 PINComplexity key last written : 14/10/2026 11:04:25 <-- 6 seconds later # Verdict: something rewrote the key during each refresh. That is live policy. # A true leftover keeps an old write time that matches no recent refresh.

Illustrative times. On the laptop I examined, the key's last write time landed a few seconds after the refresh on two separate refreshes. The companion post has the read-only steps that produce both numbers.

What good and bad look like:

Check 4: don't trust an empty History folder

⚠ Gotcha: the History cache is not where Administrative Templates live. I twice drew a wrong conclusion from C:\ProgramData\Microsoft\Group Policy\History. I searched it for Registry.pol files, found nothing relevant and took that as proof no GPO was setting the value. Microsoft documents this folder as the location of the database for the Preferences option Remove this item when it is no longer applied, for computer settings. On the laptop I examined, only Preferences data was cached there. The Administrative Template settings were not. An empty result there proves nothing about Administrative Templates.

Where do Administrative Template settings actually live? In the GPO itself. Microsoft's overview says that the Registry.pol file "contains registry settings that are specific to the HKEY_LOCAL_MACHINE key. It is stored in the GPT\Machine folder." On SYSVOL, each GPO has its own folder, which Microsoft's troubleshooting guide writes as \\<dcName>\SYSVOL\<domain>\Policies\<guid> when it locates the GPO's gpt.ini. Read the GPO's own settings, or its settings report, not the local cache.

The fix: Not Configured, in the GPO that still applies

The device doesn't need repairing. The GPO needs one setting changed.

⚠ Warning: don't delete the value by hand, and don't deploy a script that does. While a GPO still carries the setting, deleting the value only hides the problem until registry policy is processed again. A remediation that deletes it would fight Group Policy on every device, forever. Any test you run in the gap between the delete and the rewrite proves nothing.

Why deleting the value is temporary

Group Policy runs again on its own. Microsoft's Policy CSP reference for Set Group Policy refresh interval for computers says: "By default, computer Group Policy is updated in the background every 90 minutes, with a random offset of 0 to 30 minutes." It adds that "Group Policy for the computer is always updated when the system starts." The [MS-GPOD] protocol notes give the same default: "every 90 minutes, plus, by default, a random offset between 0 and 30 minutes."

Not every refresh rewrites every registry value. The Configure registry policy processing setting says that "Many policy implementations specify that they're updated only when changed," and offers an option that "updates and reapplies the policies even if the policies haven't changed." So the value comes back at whichever comes first:

value deleted by hand→registry policy processed again→GPO still sets the value→value written back

Why not deny or unlink the GPO?

Denying or unlinking does remove Administrative Template values, by Microsoft's own rules. The problem is everything else in the GPO:

  1. It removes every other setting too. A baseline GPO carries many unrelated settings. In this project it held many settings that had nothing to do with Hello and had to keep applying. Denying it to remove one Hello value would have removed all of them.
  2. It can create real tattoos. If that GPO also has Preferences items with default options, Microsoft says they "don't remove settings when a Group Policy Object (GPO) no longer applies". Those values stay behind.
  3. It is a blunt tool for a precise job. You want one setting gone. Not Configured removes exactly that one and leaves the GPO working.
✅ Tip: retire settings while the GPO still applies. The safe order is always the same. Set the setting to Not Configured. Let it reach every device. Only then, if the GPO has nothing left that you need, unlink or delete the GPO. Doing it the other way round is how real leftovers get made.

The steps

  1. Find the GPO that actually carries the setting. Search the settings of every GPO, not their names. See Find which GPO sets a registry value.
  2. Make sure the replacement is already in place. For this setting, the Intune side is the PassportForWork CSP node ./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/PINComplexity/MinimumPINLength. Configure it in Intune first, so devices never fall back to the default when the GPO value goes. The move itself is covered in Move Windows Hello policy from Group Policy to Intune.
  3. Edit the live GPO. In Group Policy Management, edit "Contoso - Workstation Baseline" and go to Computer Configuration › Administrative Templates › System › PIN Complexity › Minimum PIN length. Set it to Not Configured. Not Disabled.
  4. Leave the GPO linked and applying. Don't touch its security filtering. Its other settings still matter.
  5. Let it arrive. Because the GPO changed, the next refresh processes it. On a test device, gpupdate /force shows the result sooner.
  6. Don't deploy the delete script. If anyone wrote a remediation to delete the value, retire it. Group Policy now removes the value itself, on every device in scope.

This is the setting in the editor. It is a simulated view, but the path and setting name are the ones in Microsoft's Windows Hello policy reference:

Computer Configuration › Administrative Templates › System › PIN Complexity › Minimum PIN length
State: Not Configured
GPO: Contoso - Workstation Baseline (fictional), still linked, still applying
Intune replacement: PassportForWork/{TenantId}/Policies/PINComplexity/MinimumPINLength

If Intune already sets the value the business wants, users see no change in the PIN rules when the GPO value goes. The only difference is which source is in charge.

Proof it worked: the value goes, the GPO stays

Run the same reads again after the change has reached the device. The block below shows what to expect. It is illustrative.

PowerShell - after the fix (illustrative)
# 1. The Group Policy copy is gone Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\PassportForWork\PINComplexity' -ErrorAction Stop | Select-Object MinimumPINLength # Expected: an error saying the path does not exist, or no MinimumPINLength value # 2. The baseline GPO is still applying Get-WinEvent -LogName 'Microsoft-Windows-GroupPolicy/Operational' -MaxEvents 50 | Select-Object TimeCreated, Id, Message # Expected: "Contoso - Workstation Baseline" still in the applied list

Check four things, in this order:

  1. The value is gone from SOFTWARE\Policies\Microsoft\PassportForWork. If it is still there, the change has not arrived, or a second GPO also sets it. Check the time comparison again.
  2. The GPO is still in the applied list. This proves the value went because the setting is Not Configured, not because the GPO stopped applying. That is the difference between a clean retirement and an accidental one.
  3. The timing matches the refresh that removed the value. If the PINComplexity key still exists, its last write time should sit close to that refresh. If the key has gone completely, that is fine too: there was nothing left in it.
  4. The Intune value is now the one in force. With the Group Policy setting cleared, Microsoft's rule that "conflicting CSP settings aren't applied until the group policy settings are cleared" no longer blocks Intune.

Don't rely on a behaviour test alone. If both sources happen to hold the same value, a PIN test proves nothing either way. The registry is the evidence: which path holds the value, and when its key was last written.

References

Related reading on EndpointWeekly

The case in this post comes from one enterprise laptop during a Group Policy to Intune migration. All names, values and times shown are illustrative. Microsoft facts were checked against the pages above on 31 October 2026.

Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Group Policy
Find Which GPO Sets a Registry Value: Events 5312, 5313 and…
GPO names lie. Find the GPO that really writes a policy value with events 5312 and 5313,…
Windows Hello for Business
Windows Hello for Business: Why Group Policy Beats Intune, One…
Intune says the Hello setting applied, but the device follows Group Policy. Microsoft's…
Windows Hello for Business
Intune Says the Hello Policy Applied. Here Is How to Prove It on…
Windows Hello for Business does not write to PolicyManager like other CSP policies, so…