Reduce copy/paste drift
Templates keep approval rules, durations, and multi-factor enforcement identical across every role that references them.
EasyPIM.Orchestrator best practices
Ship policy changes once, roll them across dozens of roles, and keep every inline exception intentional.
Templates keep approval rules, durations, and multi-factor enforcement identical across every role that references them.
Security teams approve a single template change, then let EasyPIM apply the update everywhere.
Inline overrides stay co-located with the role definition so exceptions are governed, intentional, and easy to audit later.
Start by declaring the baseline approval experience in the PolicyTemplates
object. Template names become keys so every policy reference is explicit and validation can confirm they exist.
{
"PolicyTemplates": {
"HighSecurity": {
"ActivationDuration": "PT4H",
"ActivationRequirement": "MultiFactorAuthentication,Justification,Ticketing",
"ApprovalRequired": true,
"Approvers": [
{
"id": "11111111-2222-3333-4444-555555555555",
"description": "Privileged Access CAB"
}
],
"AllowPermanentEligibility": false,
"MaximumEligibilityDuration": "P30D",
"Notification_Activation_Alert": {
"isDefaultRecipientEnabled": true,
"notificationLevel": "All",
"Recipients": ["soc-alerts@contoso.com"]
}
}
}
}
Use descriptive template names (HighSecurity
, Tier0
, FinanceSOX
). They appear in drift reports, WhatIf output, and telemetry, making it obvious which safeguard is in effect.
Define each role in the array-based policy block and point it at the shared template. Set PolicySource
to "template"
so diffs stay explicit.
{
"EntraRoles": {
"Policies": [
{
"RoleName": "Security Administrator",
"PolicySource": "template",
"Template": "HighSecurity"
},
{
"RoleName": "Privileged Role Administrator",
"PolicySource": "template",
"Template": "HighSecurity"
}
]
}
}
Because they share common structure a single template can be applied to Entra and Azure roles
Only specify the fields that differ from the template. EasyPIM merges your overrides with the template and records the resulting payload as ResolvedPolicy
for auditing.
{
"EntraRoles": {
"Policies": [
{
"RoleName": "User Access Administrator",
"PolicySource": "template",
"Template": "HighSecurity",
"ActivationRequirement": "MultiFactorAuthentication,Justification,Ticketing",
"AuthenticationContext_Enabled": true,
"AuthenticationContext_Value": "c1:HighRiskOperations",
"Notification_Activation_Alert": {
"isDefaultRecipientEnabled": true,
"notificationLevel": "Critical",
"Recipients": [
"soc-alerts@contoso.com",
"compliance@contoso.com"
]
}
}
]
}
}
{
"RoleName": "User Access Administrator",
"PolicySource": "template",
"Template": "HighSecurity",
"ResolvedPolicy": {
"ActivationDuration": "PT4H",
"ActivationRequirement": "MultiFactorAuthentication,Justification,Ticketing",
"ApprovalRequired": true,
"Approvers": [
{
"id": "11111111-2222-3333-4444-555555555555",
"description": "Privileged Access CAB"
}
],
"AuthenticationContext_Enabled": true,
"AuthenticationContext_Value": "c1:HighRiskOperations",
"AllowPermanentEligibility": false,
"MaximumEligibilityDuration": "P30D",
"Notification_Activation_Alert": {
"isDefaultRecipientEnabled": true,
"notificationLevel": "Critical",
"Recipients": [
"soc-alerts@contoso.com",
"compliance@contoso.com"
]
}
}
}
Include a short note in your change review explaining why this role deviates. Auditors can trace the review back to the JSON line that changed and confirm the override in ResolvedPolicy
output.
Templates and overrides work in every execution mode. Use WhatIf to preview, then let delta or initial mode apply the synchronized policies.
$configPath = "./config/pim-template-demo.json"
Invoke-EasyPIMOrchestrator `
-ConfigFilePath $configPath `
-TenantId $TENANT_ID `
-SubscriptionId $SUBSCRIPTION_ID `
-Mode delta `
-WhatIf
# When the preview looks good, drop -WhatIf to apply
The orchestrator records whether the protected-role override token was used and which templates produced inline differences. That data feeds dashboards and audit exports.