Skip to content
InvardiaInvardia
Why InvardiaProductsFeaturesPricingCommunity
Docs
All documentation
Product documentationPIM ManagerSecurityInsight
SettingsPIM Manager settingsSecurityInsight settingsEntra Policy Suite settings
ScriptsPIM Manager scriptsSecurityInsight scriptsEntra Policy Suite scriptsInvardia scripts
Error codesPIM Manager error codesSecurityInsight error codes
API and MCPPIM Manager APIPIM Manager MCP toolsSecurityInsight APISecurityInsight MCP tools
SecurityPIM Manager security packSecurityInsight security packEntra Policy Suite security pack
Network and designPIM Manager network guidesPIM Manager command wizardNetwork egressDesign your installationCalculate your cost
SupportSetup scriptsRemote support access
Search the docs
SupportAboutContactBook a demoCustomer portalDesign your installationFree Pro trial

PIM Manager scripts

Invoke-PimDeployAll

Deploy or update PIM Manager (deploy everything)

Part of the PIM Manager release - not a standalone download; it runs via the product's own install command or the updater.

Purpose

Deploy or update the whole of PIM Manager in your own Azure subscription in one run: the hosting resources, the container image, the containers and their identities, the database schema, the mail sender, sign-in, the code, the nightly updater and the first administrators -- then verify it. Without -Apply it only prints the plan.

When to run it

To install PIM Manager into a subscription from the downloaded package, or to bring an existing installation up to date with the same parameters. The guided install (Install-PimManager.ps1) runs it for you; run it directly when you deploy by hand or from your own pipeline. Run it with -WhatIf (or without -Apply) first.

Who may run it

KindRoleScopeWhy
azureRbacOwnerthe target subscriptionIt creates the resource group and every resource in it and assigns Azure roles to the identities it creates (Contributor + User Access Administrator is the equivalent).
azureRbacUser Access Administratorthe target subscription (with Contributor, instead of Owner)Azure role assignments for the managed identities (AcrPull, Reader, Contributor for the updater).
azureRbacOwner or User Access Administrator at the tenant root management grouptenant root management group (optional)Only for the engine's Reader at the tenant root, so it can see every subscription. Without it the step warns and prints the command for the person who has it (Grant-PimEnginePermissions.ps1).
entraRolePrivileged Role AdministratortenantGrants the Microsoft Graph application permissions to the engine and Manager identities and adds members to the role-assignable SQL admin group. Global Administrator also works.
entraRoleApplication AdministratortenantCreates the engine app registration and the Manager's sign-in app registration and consents the sign-in scopes. Cloud Application Administrator works for the registrations, not for the consent of Graph application permissions.
entraRoleGroups AdministratortenantCreates the SQL admin group and the Manager's members-only sign-in group.
exchangeExchange AdministratorExchange Online (optional)Only for the mail sender step (shared mailbox + scoped send right). Without it the step is skipped with a warning and the command for the right person.
otherSigned in as yourself (browser sign-in or the Invardia Support app session; no Azure CLI), or a certificate deploy identitythe target tenant + subscriptionEvery call is pinned to -TenantId / -SubscriptionId; a signed-in run (-UseSignedInAccount) refuses a service principal, another tenant and another subscription.

What it changes

WhereActionWhatPermission / roleScopeWhyUndo
Invardiacreateenrollment of this tenant (only with -EnrollmentKey)Links the installation to your Invardia account: Invardia creates the environment, signs the licence and issues an install key.Ask Invardia support to remove the environment.
Entra IDcreatedeploy identity app registration with a certificate (only when no -AdminAppId and not -UseSignedInAccount; New-PimDeployIdentity.ps1)A one-shot deploy needs an identity that can create the hosting resources unattended.Delete the app registration 'pim-deploy' and its certificate (Cert:\CurrentUser\My, subject CN=pim-deploy-<tenant>).
Azure RBACgrantdeploy identityOwner (Network Contributor on the hub virtual network when a hub is named)the target subscription (the hub virtual network)It builds the resource group and assigns roles inside it; peering needs rights on the hub.Remove the role assignments of the deploy identity.
Microsoft Graphgrantdeploy identity (only with New-PimDeployIdentity -GrantGraph)Application.ReadWrite.All, Group.Create, GroupMember.ReadWrite.All, DelegatedPermissionGrant.ReadWrite.All (application)tenantLets an unattended deploy identity create the sign-in app, converge the SQL admin group and consent the sign-in scopes.Remove the app role assignments from the deploy identity's service principal (Enterprise applications > Permissions).
Entra IDcreateengine app registration + service principal with a certificate credential (step appreg; not with -SkipAppReg)The identity the engine uses outside the containers (and the managing tenant cross-tenant).Delete the app registration; remove the certificate CN=PIM4EntraPS-Engine from the machine store.
Exchange Onlinegrantengine app service principal (Install-PimEngineAppRegistration -IncludeExchange only; this deploy does NOT pass it)Exchange.ManageAsApp (application) + Exchange Administrator activated time-bound through PIMtenantOnly for an engine that manages Exchange; documented because the installer the step runs can do it.Remove the app role assignment; the PIM activation expires by itself.
Microsoft Graphgrantengine app service principal and the tick job's managed identity (the engine set)Directory.Read.All, User.ReadWrite.All, Group.ReadWrite.All, RoleEligibilitySchedule.ReadWrite.Directory, RoleEligibilitySchedule.Remove.Directory, RoleAssignmentSchedule.ReadWrite.Directory, RoleAssignmentSchedule.Remove.Directory, RoleManagement.Read.All, RoleManagement.ReadWrite.Directory, RoleManagementPolicy.Read.Directory, RoleManagementPolicy.ReadWrite.Directory, RoleManagementPolicy.Read.AzureADGroup, RoleManagementPolicy.ReadWrite.AzureADGroup, PrivilegedAccess.ReadWrite.AzureADGroup, PrivilegedEligibilitySchedule.ReadWrite.AzureADGroup, PrivilegedEligibilitySchedule.Remove.AzureADGroup, PrivilegedAssignmentSchedule.ReadWrite.AzureADGroup, PrivilegedAssignmentSchedule.Remove.AzureADGroup, AppRoleAssignment.ReadWrite.All, Application.Read.All, RoleManagement.ReadWrite.Defender, DeviceManagementRBAC.ReadWrite.All, AccessReview.Read.All, AccessReview.ReadWrite.All, AdministrativeUnit.ReadWrite.All, UserAuthenticationMethod.ReadWrite.All, Domain.Read.All, Policy.Read.All (application permissions, admin consent)tenantWhat the engine needs to apply the access you define: role and group assignments (eligible and active), role-assignable groups, administrative units, Temporary Access Passes, Defender and Intune roles, access reviews. Mail.Send is never granted tenant-wide.Remove the app role assignments (Enterprise applications > the identity > Permissions), or delete the identity.
Microsoft Graphgrantthe Manager's managed identity (the picker set)User.ReadBasic.All, GroupMember.Read.All (application)tenantThe web app reads only for the people and group pickers; the engine reads everything else and applies every change.Remove the app role assignments of the Manager identity.
Azurecreateresource group, virtual network + subnet (delegated to Container Apps), container registry, Log Analytics workspace, user-assigned pull identity, Azure SQL server + database (step prereq; New-PimHostingPrerequisites.ps1)Everything PIM Manager runs on, in your own subscription.Delete the resource group (this deletes the database: export it first).
Azure RBACgrantthe pull identity, the containers and the jobsAcrPullthe container registryThe containers pull their image without registry passwords.Remove the AcrPull role assignments on the registry.
Entra IDcreategroup grp-pim-sql-admins (role-assignable) as the SQL server's Entra admin, with the environment identities and the Invardia Support app (when named) as membersOne admin group for the store; role-assignable so a Groups Administrator or User Administrator cannot add themselves to it.Set another Entra admin on the SQL server, then delete the group.
Entra IDgrantthe person running a signed-in deploymember of grp-pim-sql-adminsthe SQL admin groupThe store steps connect to SQL as that person; Azure SQL is Entra-only.Remove the person from the group.
Azure SQLcreatefirewall rule AllowSetupHost for this machine's public IP (read from api.ipify.org unless -SetupHostIp)The schema, settings and access steps connect from this machine.Removed by the run at its end; otherwise: az sql server firewall-rule delete -n AllowSetupHost.
Azurecreatecontainer image pim-manager:<version> built in your registry (step image; az acr build from the package's source)The image is built from the code you downloaded, in your own registry.Delete the repository in the registry.
AzurecreateContainer Apps environment, the Manager app ca-pim-manager, the tick job ca-pim-tick, the bootstrap job ca-pim-dbinit, their system / user-assigned managed identities (step infra; Setup-PimContainers.ps1)The runtime: the Manager (GUI) and the engine, on a schedule.Delete the apps, the jobs and the environment (or the resource group).
Azure RBACgrantthe tick job's managed identity (the Manager gets Reader only)Reader (the -AzureRbacRoles list)the subscription, or -AzureRbacManagementGroupIdSo the engine can see the Azure resources whose roles you manage.Remove the role assignment.
Azure RBACgrantthe Manager's managed identity (step infra; Setup-PimContainers.ps1; verified and repaired by the end-of-install check)Readerthe PIM resource group onlyThe Environment report reads the installation's own architecture (apps, jobs, registry, SQL, Key Vault, network).Remove the role assignment (the Environment report then shows the architecture as not readable).
Azure RBACgrantthe tick job's managed identityReader (+ User Access Administrator only with -EngineAzureRootUserAccessAdmin)tenant root management groupDiscovery across every subscription; User Access Administrator only when the engine must assign the Azure roles you delegate.Remove the role assignment at the tenant root management group.
Azure SQLgrantdatabase users (CREATE USER from each identity's application id) for ca-pim-manager, ca-pim-tick, the updater and the support userone least-privilege role per component (ALTER ROLE ... ADD MEMBER): pim_web, pim_engine, pim_updater + db_ddladmin; the declared support user keeps db_datareader, db_datawriter, db_ddladminthe PIM databaseEach container reads and writes only what its job needs; only the updater applies the schema.DROP USER [<name>] in the database.
Azure SQLcreatethe least-privilege access model: a signed access procedure (pim.usp_ApplyAccess) with an in-database certificate (expires 2099, private key removed) and the component roles; skipped on an existing install that the security cut-over has not reachedthe updater may only EXECUTE the procedurethe PIM databaseEvery later update applies its grants through the procedure alone -- nothing routine needs a SQL administrator again.none needed (it holds no secret and grants only the component roles).
Microsoft Entra IDremovethe deploy identity's membership of the SQL admin group (at the end of the run; not with -KeepSetupIdentityInSqlAdminGroup)group membershipthe SQL admin groupA setup identity is a SQL administrator only for the length of an install; it is made a member again by the next run.a Privileged Role Administrator adds the member again.
Azureupdatesubnet service endpoint Microsoft.Sql + a virtual network rule on the SQL server (step sqlaccess; Set-PimSqlNetworkAccess.ps1)The containers reach SQL from their own subnet.Remove the virtual network rule and the service endpoint.
Azure SQLupdatethe PIM schema (step schema; idempotent, never destructive)Tables and columns the version needs.Restore the database from its point-in-time backup.
Exchange Onlinecreateshared sender mailbox, an Exchange service principal per sending identity (New-ServicePrincipal), a management scope for that one mailbox (New-ManagementScope), the scoped role assignment 'Application Mail.Send' (New-ManagementRoleAssignment), a shared mailbox (New-Mailbox) when absent (step mailsender; Initialize-PimMailSender.ps1)Notification mail is sent by the solution's own identities, from one mailbox only.Remove-ManagementRoleAssignment, Remove-ManagementScope, then remove the mailbox.
Exchange Onlinegrantthe Manager and tick identitiesApplication Mail.Send (Exchange RBAC)the sender mailbox only (management scope)They can send only as that mailbox; a tenant-wide Mail.Send found on them is revoked.Remove-ManagementRoleAssignment for the identity.
Microsoft Graphremovea tenant-wide Mail.Send application permission on the sending identities, if one existsA tenant-wide Mail.Send would bypass the mailbox scope.Grant it again (not recommended).
Azure SQLupdatepim.Settings feature gates scheduler.jobs, alerting.email, msp.downlink ON (step features)A deployed engine with its gates off does nothing.Turn the gates off in Settings or with Set-PimFeatureBaseline.ps1.
Entra IDcreatethe Manager's sign-in app registration ('PIM4EntraPS Manager'), its client secret (stored only as a secret of the container app), and a members-only dynamic group when every member account may sign in (step easyauth; Set-PimManagerEasyAuth.ps1)Sign-in in front of the Manager; nobody reaches it without an Entra sign-in.Remove Easy Auth from the container app and delete the app registration and the group.
Microsoft Graphgrantthe Manager's sign-in appopenid, profile, email, User.Read (delegated, admin consent via oauth2PermissionGrants)tenant (all users)So people can sign in without a consent prompt.Remove the consent (Enterprise applications > the app > Permissions).
Entra IDgrantthe people / groups in -EasyAuthAllowedPrincipals (or the members-only group)app role assignment on the sign-in app (appRoleAssignedTo), assignment requiredthe Manager's sign-in appOnly the named people may sign in.Remove the assignments, or set assignment required off.
Azureupdatethe Manager app and the jobs rolled to the new image (step code)The new version runs.Roll back to the previous revision (the deploy does this itself when verify fails).
Azurecreatenightly updater job ca-pim-update with its managed identity (step updater; Deploy-PimUpdateJob.ps1)The installation keeps itself up to date on its ring.Delete the job (Enable-PimSelfUpdate / -SkipUpdater on a re-run).
Azure RBACgrantthe updater job's managed identityContributor (+ AcrPull on the registry, Contributor on the registry when it lives in another resource group)the PIM resource group (and the registry)It rolls the container apps and builds the image of an approved version.Remove the role assignments; delete the job.
Entra IDgrantthe updater job's managed identitymember of grp-pim-sql-adminsthe SQL admin groupIt applies the schema of the version it rolls to.Remove it from the group.
Microsoft Graphgrantthe updater job's managed identity (step updater; Deploy-PimUpdateJob.ps1)PrivilegedAssignmentSchedule.ReadWrite.AzureADGroup, PrivilegedAssignmentSchedule.Read.AzureADGroup, RoleManagementPolicy.Read.AzureADGroup, GroupMember.Read.All, Application.Read.All (application; the last two read only)tenant; used on the SQL admin group onlyThe updater keeps the database job's own identity an active member of the SQL admin group through PIM for Groups (permanent where the group policy allows), reads it back before the database job starts and renews a time-limited membership before it ends (owner decision 2026-11-05).Remove the app role assignments from the updater's managed identity (Enterprise applications > Managed identities > the identity > Permissions).
Entra IDgrantthe database job's identity (before its first start; Setup-PimContainers.ps1)active member of grp-pim-sql-admins (a direct add, else an active PIM-for-Groups member assignment, permanent first; read back before the job starts)the SQL admin groupThe in-network database job creates the database users and applies the schema as a member of the SQL admin group; it is not started unless the membership is read back.Remove the membership (Groups > grp-pim-sql-admins > Members, or Privileged Identity Management > Groups > Assignments).
Azurecreatethe as-built job caj-pim-asbuilt (manual trigger) with its managed identity, the PIM storage account (no shared key, no anonymous access), its private container 'asbuilt' and the lifecycle rule that deletes the PDFs after 1 day (step updater; Deploy-PimAsBuiltJob.ps1, best effort)The as-built PDF can be produced inside the environment on request (PIM REQUIREMENTS 100.61).Delete the job, the container (or the storage account) and the lifecycle rule.
Azure RBACgrantthe as-built job's managed identityStorage Blob Data Contributor (+ AcrPull on the registry when there is no registry identity to inherit)the container 'asbuilt' only (and the registry)It writes the as-built PDF.Remove the role assignment; delete the job.
Azure RBACcreatethe custom role 'PIM Manager as-built runner (<resource group>)': Microsoft.App/jobs/start/action + Microsoft.App/jobs/executions/read, assignable in the PIM resource group (nobody is assigned here)Grant-PimSupportAccess.ps1 assigns it to the Invardia Support app on the as-built job only, with the customer's consent.Delete the role definition (after its assignments).
Azure SQLgrantthe view pim.vw_AsBuiltSettings and a contained user for the as-built job (from its app id as a SID); pim.Settings AsBuiltInstallFacts (region, network, resource group)SELECT on pim.vw_AsBuiltSettings only (people and secrets reduced to counts in SQL)the PIM databaseThe job reads only what the as-built document needs.DROP USER [caj-pim-asbuilt]; DROP VIEW pim.vw_AsBuiltSettings.
Azure SQLupdatepim.Settings ManagerAccess: the -ManagerSuperAdmins as SuperAdmin (step access; Set-PimManagerAccess.ps1)A new environment needs someone who can administer it.Change the access in Settings > Access.
Azure SQLupdatepim.Settings Alerting recipients when empty (step alerting; Set-PimAlertRecipients.ps1)Someone receives the alerts from day one.Edit them in Settings.
Azure SQLupdatepim.Settings License + InvardiaInstallKey (step licence, only with an enrollment; Set-PimLicense.ps1)Registers the licence the enrollment returned.Remove the licence in Settings > Licence.
Local machinecreatethe deploy profile (parameters of a successful -Apply, never a secret) for Update-PimCommunity.ps1, in your profile folderSo a later update can re-run exactly this deploy.Delete the profile file printed at the end.

What it only reads

  • Plan-only facts: the app registration, resource group, registry, pull identity and its AcrPull, SQL server and its Entra admin, Container Apps environment, apps, jobs, their Graph app role assignments (application permission reads), Azure role assignments, peering state, image tags.
  • The signed-in account (az account show) and its token, checked for tenant and user-ness; directory role checks name Global Administrator, Privileged Role Administrator, Application Administrator, Cloud Application Administrator, Groups Administrator, User Administrator, Exchange Administrator only to report what is missing.
  • The deployed database columns (schema drift detect) and the running image's content hash.
  • Database role memberships it checks against (db_owner, db_securityadmin, db_accessadmin, db_backupoperator, db_denydatareader, db_denydatawriter are never granted by the deploy).
  • Exchange (read): Get-Mailbox, Get-ManagementScope, Get-ManagementRoleAssignment, Get-ServicePrincipal; Organization.Read.All for the mail check; User.Read.All (delegated, the signed-in administrator) to find the sender mailbox.
  • SQL GRANT SELECT / GRANT INSERT, UPDATE on single tables for special-purpose users (the publish and support readers) are only made by the managing-tenant build steps, not by this deploy.

Parameters

ParameterRequiredDefaultWhat it does
-Sourcenosync-automateitsync-automateit = hosted (Container Apps + Azure SQL); git-pull = a VM / local install.
-ScenarionoDeployment scenario (S1 single, S2, S3 managing tenant, S5/S6 managed tenant); decides the topology.
-DescriptornoPath of an environment deployment descriptor (AutomateIT framework only).
-ApplynofalseRun the plan. Without it (or with -WhatIf) only the plan is printed.
-ValidateOnlynofalseRun only the verification (hosted smoke + deploy-validation tests) against a deployed environment.
-TenantIdyesYour tenant id.
-SubscriptionIdyesThe subscription to deploy into.
-ResourceGroupyesThe resource group for PIM Manager.
-VnetNamenovnet-pim-<token>The virtual network (derived from -PrereqToken when empty).
-VnetResourceGroupnothe -ResourceGroupResource group of the virtual network.
-AcrNameyesThe container registry name.
-WorkerModenocroncron (one scheduled engine job, the approved shape) or always-on worker apps.
-ManagerMinReplicasno0Minimum Manager replicas (0 = scale to zero).
-TickCronno*/5 * * * *Schedule of the engine job (UTC).
-TickJobNamenoca-pim-tickName of the engine job.
-TenantObjectCountsnocounted by the install (Microsoft Graph $count)@{ Users; Groups; ServicePrincipals } already counted by the caller; the engine job is sized for that count instead of counting again.
-MailSendernoAddress of the shared sender mailbox.
-EnvNamenocae-pimContainer Apps environment name.
-LocationnowesteuropeAzure region.
-ImageReponopim-managerImage repository in the registry.
-AppsnodiscoveredThe container apps to roll (empty = discover).
-ManagerAppnoca-pim-managerName of the Manager app.
-NewInstallNamesnooff (also $env:PIM_Setup_NewInstallNames)A NEW install takes the new resource names (ca-pim-web, ca-pim-engine, caj-pim-updater) and "PIM Manager" display names. Azure cannot rename: a resource group that already runs PIM Manager keeps its names. Only names you did not pass change.
-ImageTagnothe package VERSIONImage tag to build and deploy.
-AcceptBaselineChangenofalseAccept an image that changes the policy baseline, for this one run. The code step refuses such an image and names this switch; give it when the change is intended.
-SqlServerFqdnnoThe Azure SQL server (<name>.database.windows.net).
-SqlDatabasenoPimPlatformThe database.
-SqlConnectionStringnoConnection string used to detect schema drift.
-SqlAdminClientIdnoCertificate mode: the SQL Entra admin application.
-SqlAdminClientSecretnoLegacy: a client secret for the SQL admin application (use the certificate or the signed-in account).
-SqlAdminCertThumbprintnoCertificate mode: the SQL admin application's certificate thumbprint.
-SupportDbAppIdno$env:PIM_SUPPORT_DB_APPIDApplication id that gets a support database user.
-SupportDbUserNamenoPIM4EntraPS-DeployName of that database user.
-AdminAppIdnoCertificate mode: the deploy identity's application id (created when absent).
-AdminSecretnoLegacy: a client secret for the deploy identity (use the certificate or the signed-in account).
-AdminCertPemnoCertificate mode: PEM file of the deploy identity for az.
-PrereqTokennoShort environment token the prerequisite names are derived from.
-PrereqIndexno-1Address-plan index (<base>.<index*8>.0/21) when no explicit prefixes are given.
-PrereqAddressBaseno10.220Address base for -PrereqIndex.
-PrereqSubnetNamenoSubnet name for the containers.
-PrereqVnetAddressPrefixnoYour own virtual network range.
-PrereqSubnetAddressPrefixnoYour own subnet range.
-PrereqIdentityNamenoid-pim-<token>Name of the registry pull identity.
-PrereqSkipSqlnofalseDo not create a SQL server (central store).
-SqlConnectionPolicynoDefaultSQL connection policy (Proxy for a firewalled network).
-AcrSkunoBasic (external) / Premium (internal)Registry SKU.
-AcrPublicAccessnoDefaultRegistry public network access.
-PrivateEndpointSubnetNamenopim-endpointsSubnet for private endpoints.
-PrivateEndpointSubnetAddressPrefixnoRange of that subnet.
-AcrAgentPoolNamenoRegistry agent pool (a private registry).
-SqlPrivateEndpointnoon for -Exposure internalGive SQL a private endpoint.
-SkipHostedSmokenofalseDo not run the post-deploy GUI check (only when it cannot reach the Manager).
-FeatureGatesnoscheduler.jobs, alerting.email, msp.downlinkFeature gates turned on.
-FeatureGatesDisablenononeFeature gates turned off.
-NotHostednofalseA VM install (no Container Apps).
-RegistryIdentityResourceIdnoThe registry pull identity's resource id.
-LogAnalyticsWorkspaceNamenoExisting Log Analytics workspace to use.
-LogAnalyticsResourceGroupnoIts resource group.
-Exposurenoexternalexternal or internal (VNet-internal) Container Apps environment.
-BaselineTrustedKeysnononeManaged tenant: the managing tenant's signing key ids the Manager pins.
-BaselineDocUrlnoManaged tenant: where the managing tenant publishes the signed bundle.
-HubVnetNamenoYour hub virtual network (for peering and DNS).
-HubVnetResourceGroupnoIts resource group.
-HubVnetSubscriptionIdnothe -SubscriptionIdIts subscription.
-PrivateDnsResourceGroupnoResource group for the private DNS zone.
-SkipPrivateDnsnofalseDo not create the private DNS zone.
-SkipPeeringnofalseDo not create the peering (you make it yourself).
-PrivateDnsZonesResourceGroupIdnoYour central privatelink zones (a resource group id, any subscription): used by the private endpoints, never created or written -- no zone and no link is made there.
-SkipZoneLinkToHubnofalseLink the Container Apps environment's private zone to the PIM network only, not to the hub (the guided install's -LinkZonesToHub off).
-SqlPublicAccessDisablednofalseWith the SQL private endpoint: the SQL server is created with public network access disabled and no firewall rule is written (a private install stays private).
-LinkZonesToHubnofalseAlso link the installation's own privatelink zones to the hub (never your central zones).
-PeeringAllOrNothingnofalseCheck the peering rights on both VNets before any write, and never leave half a peering (a failed second side removes the first).
-InternalRangesno[]With -FirewallIp (both or neither): your internal ranges. The prerequisites step gives the apps subnet a return route for each (route table rt-pim, next hop VirtualAppliance -> -FirewallIp, BGP route propagation off), read back.
-FirewallIpnoWith -InternalRanges: the hub firewall's private IP, the return route's next hop.
-ReturnRouteHandOffOnlynofalseThe VNet is your own: the return route is not written to it, it is printed as a network hand-off line instead.
-SkipSqlNetworkAccessnofalseDo not grant the subnet access to SQL (private endpoint stores).
-SqlSubscriptionIdnoSubscription of a central SQL server.
-DnsServernoYour DNS server for the environment.
-AzureRbacRolesnoReaderAzure roles for the engine identity.
-AzureRbacManagementGroupIdnoManagement group scope for those roles (else the subscription).
-SkipAzureRbacnofalseGrant no Azure roles to the engine identity.
-RequireAzureRbacnofalseFail when the Azure roles cannot be granted.
-EngineAzureRootUserAccessAdminnofalseAlso User Access Administrator at the tenant root for the engine (opt-in).
-SkipEngineAzureRootAccessnofalseNo Reader at the tenant root.
-ManagerSuperAdminsno$env:PIM_MANAGER_SUPERADMINSSign-in names that become SuperAdmin (comma-separated).
-EngineClientIdnoEngine application id (certificate mode / deploy validation).
-EngineCertThumbprintnoEngine certificate thumbprint.
-EngineClientSecretnoLegacy: an engine client secret (use the certificate).
-LogAnalyticsWorkspaceIdno$env:PIM_HOSTED_LA_WORKSPACEWorkspace the GUI check reads the boot log from.
-EasyAuthAudienceno$env:PIM_HOSTED_EASYAUTH_AUDSign-in audience for the GUI check.
-EasyAuthClientIdnoUse an existing app registration for sign-in.
-EasyAuthAllowedPrincipalsnononePeople / groups that may sign in (recommended).
-EasyAuthAllowAllTenantUsersnofalseEvery member account may sign in (no guests).
-KeepSetupHostRulenofalseKeep the AllowSetupHost firewall rule (a caller that closes it later).
-KeepSetupIdentityInSqlAdminGroupnofalseKeep the identity this run used for SQL in the SQL admin group at the end (a caller that still needs SQL afterwards and releases it itself). Without it, that identity leaves the group again at the end of the run and is made a member again by the next run.
-SetupHostIpnoread from api.ipify.orgThis machine's public IP.
-UpdateJobNamenoca-pim-updateName of the updater job.
-UpdateCronno0 3 * * *Updater schedule (UTC).
-UpdateSourceUrlTemplateno$env:PIM_UPDATE_SOURCE_URLWhere the updater fetches source ({version} template).
-UpdateRingno2The update ring the updater follows.
-UpdateSourcenounchangedpim-src, Invardia (Pro: the signed licence feed) or InvardiaCommunity (Community: the signed Community channel). Empty: a Community install (S2) gets InvardiaCommunity, ring 3.
-OverrideRingGatenofalseRoll a version the ring does not approve (audited; needs -Reason).
-ReasonnoWhy the ring gate is overridden.
-SkipUpdaternofalseInstall no updater.
-SkipMailSendernofalseCreate no sender mailbox and use no Exchange role. Your Exchange administrator sets up the mail sender afterwards (Get Started > Mail sender).
-DeployMarkernoPIMCOREENGINE-Marker for the deploy-validation test objects.
-EngineAppDisplayNamenoPIM4EntraPS EngineDisplay name of the engine app registration.
-SkipVerifynofalseSkip the verification (not recommended).
-SkipAppRegnofalseThe engine app registration exists already (created out of band).
-DbInitJobNamenoca-pim-dbinitName of the bootstrap job (private SQL).
-SqlAdminGroupNamenogrp-pim-sql-adminsThe SQL admin group.
-SupportAppIdnoThe Invardia Support app's application id (added to the SQL admin group).
-UseSignedInAccountnofalseDeploy as the person signed in to az (no deploy identity, no certificate).
-EnvLabelnoLabel for a second environment in the same tenant.
-OnStepnoCallback per step event (used by the guided install).
-AlertRecipientsnothe SuperAdmins' mailboxesAlert recipients when none are stored.
-SkipInstallVerifynofalseSkip the end-of-install check (a caller that runs its own).
-RunDevGatesnofalseDeveloper gates only: run the hosted smoke and the deploy-validation tests from the tests folder (needs the Azure CLI and Pester). Off for every customer install, which runs the built-in check instead.
-LicenceExpectednofalseThe licence line of the end-of-install check is required.
-InvardiaInstallTokenno$env:INVARDIA_INSTALL_TOKENTracked install: report each step to Invardia.
-InvardiaInstallEventsUrlnohttps://invardia.com/api/install/eventsWhere tracked steps are reported.
-EnrollmentKeynoInvardia enrollment key (never printed or saved).
-InvardiaBaseUrlnohttps://invardia.comInvardia address for the enrollment.
-EnrollmentTimeoutSecondsno900How long to wait for the signed licence.

Preview with -WhatIf

Prints the ordered plan (every step: run, current, not applicable) and, under it, each change a step marked to run would make (object, permission, scope) -- for example '[infra] Microsoft Graph application permissions -> ca-pim-tick identity (the engine set) @ tenant'. Plan-only reads only; -WhatIf wins over -Apply: no Invardia claim, no deploy identity, no firewall window, no step runs.

Undo

Delete the resource group (export the database first), the Entra objects it created (engine app registration, the Manager's sign-in app, grp-pim-sql-admins, the members group), the role assignments at the tenant root management group, and the Exchange management role assignment, scope and mailbox. See each change's undo.

Network

It connects to: management.azure.com, graph.microsoft.com, login.microsoftonline.com, <server>.database.windows.net (TCP 1433), <registry>.azurecr.io, outlook.office365.com (Exchange Online admin API, mail sender step), api.ipify.org (this machine's public IP, unless -SetupHostIp), invardia.com (only with -EnrollmentKey or a tracked install), the Azure CLI extension index (azcliextensionsync.blob.core.windows.net): az installs its 'containerapp' extension once when it is missing (extension.use_dynamic_install, set by the prerequisite / container / image steps) -- az's own download, checked against the index's sha256, the update source URL (-UpdateSourceUrlTemplate), fetched by the updater job in Azure -- not by this script

How it runs

Part of the PIM Manager release - not a standalone download; it runs via the product's own install command or the updater.

Release 3.0.70

Every script, identity and permission for your security review: PIM Manager

InvardiaInvardia

See the risk. Control the access.

Products

PIM ManagerSecurityInsightEntra Policy SuiteAll featuresPricingFree 60-day Pro trialBook a demoWhy Invardia

Docs

DocumentationSearch the docsPIM Manager settingsSecurityInsight settingsPIM network guidesCommand wizardNetwork egressPIM Manager design configuratorSecurityInsight design configuratorDesign your installationCalculate your cost

Company

AboutContactCustomer portalSupportHow support worksHow updates reach youSupport in numbersSetup scriptsRemote support accessContact: info@invardia.com

Legal

Terms of saleLicence termsData processingPrivacyCookiesCompany information
© 2026 Invardia – a brand of 2LINKIT, founded and owned by Morten Knudsen · Strandvejen 21A, 6000 Kolding, Denmark · VAT DK39208032 · Contact: info@invardia.com