Client agent: operations and rollout

For administrators. As of September 2026 (Server 1.0.31, Agent 1.0.36). Related guides: Administration Handbook (chapter "Connecting clients"), Quick Admin Guide (step by step with screenshots), Devices without a domain (API key), Known issues, Distributing MSIX packages, Policies and templates.


1. What is this?

The ZeroPortal client agent runs on the end device. It asks the portal what is assigned to the computer and to the signed-in user, and puts that into effect locally: MSIX packages (also as App Attach), App-V packages and connection groups, and ZeroPortal policies. It tells the portal that the device and user are active (licence receipt), and shows the user through a tray icon what is happening right now.

Part Runs as Job
Service ZeroPortalAgent Local System account Machine sync: machine-wide packages, mounting App Attach images, App-V for the computer, computer policies. Starts the tray icon in every session.
Scheduled task \NickIT\ZeroPortalAgent\UserSync Signed-in user User sync at sign-in, unlock, and on an interval: user packages and user policies.
Tray icon Signed-in user Status, managed packages, manual sync, repair, logs, deployment times.
Path
Installation C:\Program Files\NickIT\ZeroPortalAgent
Group policy template (ADMX, de-DE and en-US) C:\Program Files\NickIT\ZeroPortalAgent\admx
PowerShell module ZeroPortalAgent installed with the agent, cmdlets *-ZPAgent*
Logs C:\ProgramData\NickIT\ZeroPortalAgent\Logs
App Attach mount point (default) C:\ProgramData\NickIT\AppAttach
Settings HKLM\SOFTWARE\NickIT\ZPAgent (local), HKLM\SOFTWARE\Policies\NickIT\ZPAgent (group policy)

Signing in to the portal. On a domain, the agent needs no configuration: the service signs in with the computer account (Kerberos), the user sync with the user's ticket. Devices without a domain fetch a key of their own through an enrollment token (stored protected under HKLM\SOFTWARE\NickIT\ZPAgent\Auth); if a key exists, it is used, otherwise Kerberos. See Devices without a domain (API key).


2. What is this good for?


3. How do I use this?

3.1 Getting the agent MSI

The agent MSI matching the server is in the portal's sidebar under Download (full administrators, and groups with level Read for the Download area on the Permissions page). New agent versions arrive with the server update.

Download centre with the agent

Edge and SmartScreen warn about a rarely downloaded file: Keep and Keep anyway. For regular downloads, exempt the portal's domain by policy (section 3.2).

Keep download

SmartScreen: keep anyway

3.2 Preparing the browser: intranet zone and SmartScreen

Intranet zone. For the browser and the agent to sign in via Kerberos without a login window, the portal URL belongs in the Local Intranet zone. A login window despite correct permissions is almost always this missing zone mapping (missing permissions show up as "no access"). By GPO: User Configuration → Administrative Templates → Windows Components → Internet Explorer → Internet Control Panel → Security Page → Site to Zone Assignment List, portal FQDN with value 1; this also applies to Edge and Chrome. An SPN is only needed if the portal is reached under an alias name (Known issues).

Portal domain as an intranet site

SmartScreen. GPO Computer Configuration → Administrative Templates → Microsoft Edge → SmartScreen settings → Configure the list of domains for which Microsoft Defender SmartScreen won't trigger warnings (registry: HKLM\SOFTWARE\Policies\Microsoft\Edge\SmartScreenAllowListDomains, value 1 = portal FQDN). If Edge reports "unsafe download blocked", the portal was opened over HTTP instead of HTTPS.

3.3 Preparing group policy (ADMX)

Where do I find the ADMX template? It is installed with the agent and sits on every device with the agent under

C:\Program Files\NickIT\ZeroPortalAgent\admx

The folder holds ZeroPortalAgent.admx and the language folders de-DE and en-US with the matching .adml files. There is no separate download: install the agent once on any machine (the portal server works too) and take the files from there.

Copy the files into your domain's central store (\\<domain>\SYSVOL\<domain>\Policies\PolicyDefinitions). The settings then appear under Computer Configuration → Administrative Templates → NickIT → ZeroPortal Agent.

The settings of the ADMX template

Four settings decide everything else. They sit directly in the ZeroPortal Agent folder; all others are in the subfolders.

Setting What it does
Publishing servers The portal URLs, one per line, optionally as Display name\|https://server:port. The order is the priority. Without this, the agent doesn't know whom to ask. A configured list replaces any locally entered one.
Enable MSIX sync The agent delivers MSIX packages and App Attach.
Enable App-V sync The agent delivers App-V packages and connection groups. See the warning below.
Enable policy sync The agent applies ZeroPortal policies: drives, printers, desktop, scripts, and the other templates.

After installation, all three sync areas are off: the agent connects to the portal but delivers nothing. Turn on only what you really need.

Publishing servers in priority order

Keep App-V sync off when the Microsoft App-V client fetches the packages. There are two ways to do App-V, and only one may be active on a device. Either the Microsoft App-V client queries the portal itself as its publishing server — then Enable App-V sync stays off. Or the ZeroPortal agent handles the App-V packages — then enter no publishing server in the Microsoft client. If both run, they publish and remove the same packages in turn: shortcuts disappear and come back, and the log entries chase each other. MSIX and policies are not affected; they may run side by side.

With your own PKI, distribute the portal's server certificate with the same GPO into the computer's Trusted Root Certification Authorities store; the service runs as System and does not see user certificates.

3.4 Installing the agent

msiexec /i ZeroPortalAgent-<Version>.msi /qn

The service starts right away, the first machine sync runs about 30 seconds later, and the tray icon appears in every signed-in session. No restart is needed.

Agent setup

You only need MSI parameters if you work without group policy (test, workgroup):

Parameter Meaning
SERVER=https://portal:8443 Portal URL as entry 1 of the local server list; SERVERNAME= sets the display name (default ZeroPortal)
MSIXSYNC=1, APPVSYNC=1, POLICYSYNC=1 Turn on the three sync areas. They survive a later upgrade without the parameters
ENROLLTOKEN=zpe_… Enrollment token for devices without a domain (Devices without a domain (API key))
TRUSTCERT=1 Adopt the portal certificate into the computer store at first contact if its chain cannot be validated (test only)
NOTRAY=1 No tray icon, and therefore no notification cards (Agent/TrayAutostart=0)
NOTOASTS=1 Tray icon without notification cards (Agent/ToastMode=Off)

Upgrade. A newer MSI installs over the existing version; the service and tray restart in the process. For a big version jump, or if an upgrade rolls back with error 1603: uninstall the old version, then install the new MSI. Avoid series of installs and service restarts minutes apart (section 5.2).

3.5 First check

On the client, in an administrative PowerShell session:

Get-ZPAgentStatus                 # service reachable, version, server list
Get-ZPAgentSync                   # which areas are on, and where the value comes from
Sync-ZPAgentPublishingServer      # trigger a sync right now
Get-ZPAgentPackage                # packages managed by the agent

The user sees the same in the tray icon: Sync now, Show packages…, Open logs, Deployment times…, and Settings… (central settings take precedence).

Tray icon menu

Triggering a sync from the tray

After the first sync, the device appears in the portal on the Global Configuration → Agent enrollment page, on the Known clients card.

3.6 Changing settings

The rule of thumb: what the agent needs to start comes from group policy. How it behaves in operation comes from a policy in the portal.

Group policy offers 25 settings, the portal policy reaches all 57 switches. Only group policy has the publishing servers and the enrollment token — the agent needs both before it can reach a portal at all. Conversely, 34 switches have no entry in the template, among them the App Attach mount path, the rules for removal, downgrade and self-healing, and the tray behaviour; set those through the portal policy or locally. Appendix 6.1: if the ADMX column names a setting, it also works by group policy.

  1. Group policy (ADMX) for the server list, failover, timing, the three sync switches, and logging. Always wins.
  2. ZeroPortal policy of type Agent configuration in the portal (template Agent configuration, see Policies and templates): reaches every switch in the catalogue. Takes effect at the next sync; a value later removed from the policy is reset on the device.
  3. PowerShell, locally, with Set-ZPAgentConfiguration -<switch> <value>; every switch is its own parameter, and tab completion lists them all:
Get-ZPAgentConfiguration                                 # all switches: name, value, SetByGroupPolicy, area
Get-ZPAgentConfiguration -SyncIntervalMinutes            # just this switch
Set-ZPAgentConfiguration -SyncIntervalMinutes 30
Set-ZPAgentConfiguration -LogLevel Debug
Enable-ZPAgentSync -Msix -Policy                         # turn sync areas on locally

Agent configuration policy in the portal

3.7 Publishing servers without group policy

Add-ZPAgentPublishingServer -Name 'ZeroPortal' -Url 'https://portal:8443'
Get-ZPAgentPublishingServer
Remove-ZPAgentPublishingServer -Name 'ZeroPortal'

The local list only applies while no GPO list is configured; once the GPO applies, the local list is ignored (not deleted).

3.8 Changing the App Attach mount path

MSIX/AppAttachMountRoot sets where App Attach images (VHDX/CIM) are mounted; empty means C:\ProgramData\NickIT\AppAttach. If the path is unusable (drive missing), the agent falls back to the default (event 3535). A change remounts every App Attach package under the new path at the next sync and registers it again — so do it in a maintenance window: Set-ZPAgentConfiguration -AppAttachMountRoot 'D:\AppAttach' (or the Agent configuration policy), Stop-Service ZeroPortalAgent, restart. Mounts do not survive a restart; the agent clears out empty folders of the old path at startup.

3.9 Site-local package source

MSIX/MSIXPackageRoot (ADMX: Package source root override) replaces the prefix \\server\share of the catalogue URL with a local path or DFS path; the rest of the path stays. Applies to MSIX bits and App Attach images. If a package is missing there, the agent loads it from the original source.


4. Rules: when does what apply

4.1 Order of precedence for settings

When reading settings: group policy before the Agent configuration policy before the local value (PowerShell, MSI parameters) before the built-in default. If a switch is set by GPO, Set-ZPAgentConfiguration and Enable-ZPAgentSync have no visible effect; Get-ZPAgentConfiguration shows this in the SetByGroupPolicy column.

4.2 Timing

Action When
Machine sync after start about 30 s after the service starts, no random offset
Recurring machine sync every MSIX/SyncIntervalMinutes (60) plus 0 to Agent/SyncJitterMinutes (10) random
User sync at sign-in and unlock, then at the same interval as the machine sync
Policy refresh (policies only) first 2 min after the service starts, then every Policy/RefreshMinutes (90)
Deferred uninstalls 5 min after the service starts, then every MSIX/SweeperIntervalHours (4)
No server reached machine sync retries after Agent/SyncFailureRetryMinutes (5) until a server answers; user sync at the next trigger
Server unreachable (failover) after Agent/FailoverTimeoutSeconds (10 s), the next server; the failed one is avoided for Agent/ServerBlacklistMinutes (10), and the blacklist is cleared at every service start

A new interval applies after the next run; Periodic user sync, Log level, and Alternative log path at the next service start or user sync.

4.3 Server list and failover

4.4 Removal, downgrade, format switch

4.5 Offline: notebooks and mobile devices

Delivery Without portal and share
MSIX (installed locally) runs without restriction
App-V, fully loaded runs without restriction
App-V, partly streamed only the part already loaded; before travelling, load the package fully from the tray
App Attach (VHDX/CIM from the share) does not run: the package is mounted from the share, not copied

Practical rule: mobile devices get MSIX or fully loaded App-V, not App Attach.


5. Operations and troubleshooting

5.1 Logs

What Where
Service (machine sync) C:\ProgramData\NickIT\ZeroPortalAgent\Logs\agent-<YYYYMMDD>.log, one file per day
User sync usersync-<username>-<YYYYMMDD>.log in the same folder; if the user cannot write there, under %LocalAppData%\NickIT\ZeroPortalAgent\Logs

The agent writes only to these text files, not to the Windows event log. Every line carries a timestamp, a level (INF, WRN, ERR), and the event ID in square brackets (appendix 6.4); each sync ends with a summary of counters and the names of failed packages.

5.2 Running it stably and finding faults

Every service start remounts all App Attach images and runs a full sync. Installs, uninstalls, or service restarts minutes apart cause mount/unmount churn in which modern apps (Task Manager, Start menu) can crash at launch — temporarily, with no lasting damage. So: after an install, wait for the first sync; while testing, stop the service between changes (Stop-Service ZeroPortalAgent) instead of quickly restarting it; on test devices with many App Attach packages, throttle the periodic sync (Agent/MachineSyncPeriodicEnabled=0 or a larger MSIX/SyncIntervalMinutes). If it happens: stop the service, restart the device.

Symptom Cause Fix
Agent installed, nothing happens Sync areas off out of the box; no server list Get-ZPAgentSync, Get-ZPAgentStatus; set the GPO Enable … sync settings and Publishing servers, gpupdate /force, Sync-ZPAgentPublishingServer
Log: 3506 / 3516 "reached NO publishing server", 2108 "short retry" Portal unreachable, name does not resolve, certificate not trusted, port closed Test the URL from Get-ZPAgentStatus in the client's browser; certificate chain in the computer store; firewall to the portal port
Log: 3503 / 3513 server on the blacklist although it is running Under load, the server answers more slowly than the failover timeout Raise Agent/FailoverTimeoutSeconds; the block expires after Agent/ServerBlacklistMinutes or at the next service start
Log: 3504 / 3514 "answered with an error" Portal reachable but refuses (permissions, Kerberos) Check the portal log and permissions; check clock skew and SPN (Known issues)
Login window when opening the portal; Edge blocks the MSI Portal URL not in the intranet zone; SmartScreen, or opened over HTTP Section 3.2
Service does not start Startup error Search agent-<date>.log for event 4000; also the Windows event log (.NET Runtime, Application Error)
Package stays installed despite being retracted Cleanup run skipped because a server did not answer (3500) Make the server reachable; with independent portals keep every server reachable, or use failover
Package is not removed, tray shows the removal as scheduled Application running; removal deferred (WhenIdle/OnReboot) Wait for RemovalIdleTimeoutHours, run Invoke-ZPAgentPendingRemoveSweep, or restart
An older version is not installed (2538 / 3510) Downgrade not allowed MSIX/AllowDowngrade, or the Package downgrade control policy for the package family
App Attach application does not start after a restart (3532 / 3533) Image not yet reachable after the restart (share, network) The service keeps retrying the mount; check the share and the computer account's permissions; no App Attach for mobile devices
Log: 3535 mount path unusable MSIX/AppAttachMountRoot points at a missing drive Correct or clear the path (section 3.8)
Log: 3620 / 4531 "falling back to MSIX" No App Attach image in the requested format, or mounting failed Create the image in the portal (Distributing MSIX packages); check the share
Log: 3410 "deployment took … s" Signature checking waits on internet lookups (intermediate certificate, revocation lists); typical for devices without internet The message names the cause; the settings in Known issues cut the time from minutes to seconds without weakening signature checking
Notice "No more licences are free for you" Licence volume used up; applications still run Check licensing in the portal (Users, permissions, licences and logs)
A new AD group membership only applies after signing out and back in The user's Kerberos ticket does not contain the group yet Agent/PurgeUserTicketsBeforeSync=1 (GPO Purge the user's Kerberos tickets before a user sync), mind the side effects
Modern apps crash at launch Mount churn from restart series (see above) Stop the service, restart the device

6. Appendix: technical reference

6.1 Switches

The switches an administrator typically changes. Settable by GPO (column "ADMX"), by the Agent configuration policy, or locally with Set-ZPAgentConfiguration -<switch> <value>. Get-ZPAgentConfiguration on the device gives the full list with current values; every switch is a parameter of Set-ZPAgentConfiguration.

Switch Area Default ADMX Meaning
MSIXSyncEnabled MSIX off Enable MSIX sync MSIX and App Attach sync (computer and user)
AppVSyncEnabled AppV off Enable App-V sync App-V packages and connection groups for computer and user
PolicyProcessingEnabled Policy off Enable policy sync Fetch and apply ZeroPortal policies
SyncIntervalMinutes MSIX 60 Sync interval Interval for machine and user sync (5 to 1440)
MSIXPackageRoot MSIX empty Package source root override Site-local package source (section 3.9)
AppAttachMountRoot MSIX empty Mount point for App Attach images; empty = C:\ProgramData\NickIT\AppAttach
AllowDowngrade MSIX off Put an older version over an installed newer one; a policy per package family takes precedence
GlobalRemovalPolicy MSIX Immediate Immediate, WhenIdle, OnReboot, Disabled
DeferRemovalWhileInUse MSIX on Defer removal while the application runs
RemovalIdleTimeoutHours MSIX 24 Remove after n hours at the latest
ServerFailover Agent on Server failover mode Priority chain of identical replicas; off = merge-all
FailoverTimeoutSeconds Agent 10 Field in Server failover mode Wait per server for an answer (1 to 300)
RandomServer Agent off Random server selection Random start server per run
ServerBlacklistMinutes Agent 10 Server blacklist duration Avoid a failed server this long; 0 = off
PurgeUserTicketsBeforeSync Agent off Purge the user's Kerberos tickets before a user sync klist purge before every user sync
TrustServerCertificate Agent off Adopt the portal certificate at first contact (MSI TRUSTCERT=1, test only)
LogLevel Agent Information Log level None, Error, Warning, Information, Debug
LogPath Agent empty Alternative log path A different folder for the logs

6.2 Registry

Three roots: GPO = HKLM\SOFTWARE\Policies\NickIT\ZPAgent (wins when read; the agent reads every catalogue key here, even ones without an ADMX entry), Local = HKLM\SOFTWARE\NickIT\ZPAgent (PowerShell, MSI parameters, Agent configuration policy), User = HKCU\SOFTWARE\NickIT\ZPAgent.

Root Subkey Content
GPO \Servers Value names 1, 2, 3 … (priority), data URL or Name\|URL
GPO \Agent, \MSIX, \AppV, \Policy The switches in the ADMX column of 6.1
GPO \Auth EnrollmentToken (enrollment token)
GPO \Privacy AnonymizeLogNames (no effect in this version)
GPO \UI Tray defaults Language, Theme, ShowFrameworks, ShowTooltips; no ADMX entry, by hand only
Local \Agent, \MSIX, \AppV, \Policy Local values of the same switches
Local \Auth ApiKey (device key, DPAPI-protected), EnrollmentToken (MSI), ApiKeySeed (MSI APIKEY=, adopted and deleted at the first service start)
Local \Servers\<No> Url, Name, GlobalRefreshEnabled, UserRefreshEnabled, RequestTimeoutSec
Local \ServerBlacklist Value name = server number, data = expiry (UTC ticks)
Local \MSIX\ManagedPackages\<Family> Machine-wide managed MSIX and App Attach packages
Local \AppV\ManagedPackages, \AppV\ManagedGroups, \AppV\ManagedUserPackages\<SID>, \AppV\ManagedUserGroups\<SID> App-V packages and connection groups published by the agent (computer, or per user)
Local \AppliedPolicies\AgentConfig State before an Agent configuration policy, for resetting
Local \UI Tray defaults for every user of the device
User \Agent DisplayName (the user's display name in the portal)
User \Auth ApiKey (user key of local accounts, DPAPI-protected)
User \MSIX\UserRegistrations\<Family> Packages registered for the user
User \UI The user's tray settings: Language, Theme, ShowFrameworks, ShowTooltips

The tray icon has no autostart entry under Run; the service starts it (Agent/TrayAutostart). Values set by ZeroPortal policies (drives, registry, shortcuts …) live at their respective targets, not under ZPAgent.

6.3 Cmdlets of the ZeroPortalAgent module

Cmdlet Purpose
Get-ZPAgentStatus Service reachable, versions, machine sync state, server list
Sync-ZPAgentPublishingServer [-Method All\|Computer\|User] Trigger a sync; without -Method the sync switches apply, with -Method the run is forced. Alias Invoke-ZPAgentSync
Get-ZPAgentConfiguration [-MSIX] [-AppV] [-Agent] [-Policy] [-<switch>] Effective values with SetByGroupPolicy
Set-ZPAgentConfiguration -<switch> <value> Write a local value (HKLM, elevated rights)
Enable-ZPAgentSync / Disable-ZPAgentSync -Msix -AppV -Policy -All Switch sync areas locally
Get-ZPAgentSync The three areas with state and source (GPO, local, default)
Add- / Set- / Get- / Remove-ZPAgentPublishingServer Local server list
Set-ZPAgentDisplayName -Name <text> [-Scope User\|Machine] Display name in the portal (users without elevated rights)
Get-ZPAgentPackage [-Machine] [-User] Packages managed by the agent
Get-ZPAgentMountedPackage [<Family*>] Which image an App Attach package actually uses
Invoke-ZPAgentPendingRemoveSweep Run deferred uninstalls now
Clear-ZPAgentLog Delete the agent logs

6.4 Event IDs in the agent log (selection)

ID Level Meaning
2100 INF Service start: machine sync schedule
2101 / 2519 / 2601 INF Machine sync, user sync, user sync task finished (with counters)
2108 INF No server reached, short retry scheduled
2500 / 2510 INF Catalogue fetched from the server (computer / user); 2510 also: key received via enrollment token
2507 / 2516 INF Framework still needed and stays (computer / user)
2538 INF Newer version already installed, requirement counts as met; also a user registration switched to App Attach
2541 INF Permitted downgrade, the newer version is removed first
2605 INF The user's Kerberos tickets purged before the sync
2701 / 2702 / 2703 / 2704 INF/WRN App-V sync off, App-V client missing, catalogue fetched, fetch failed
3410 WRN Deployment took longer than SlowDeployWarnSeconds (30), with cause (certificate chain, revocation lists)
3500 WRN Cleanup run skipped because a fetch failed
3503 / 3513 WRN Server unreachable, put on the blacklist (computer / user)
3504 / 3514 WRN Server answered with an error, or no server enabled for this run
3505 / 3515 WRN No server reachable, run is retried
3506 / 3516 WRN No server reached, offline cache in use (computer / user)
3510 WRN Local version newer, downgrade not allowed
3532 / 3533 WRN App Attach image missing or unreachable, retrying
3535 WRN Mount path unusable, falling back to the default
3541 WRN Downgrade not possible, the newer version could not be removed
3544 WRN Format switch postponed, application running
3600 WRN Policy fetch failed, offline cache in use
3620 WRN App Attach requested, no image in the requested format, falling back to MSIX
4000 ERR Service could not start (full cause)
4100 / 4110 ERR Scheduled run crashed / user sync task could not be created
4500 / 4510 ERR Catalogue fetch failed (computer / user)
4501 / 4511 ERR Package deployment failed (computer / user), with error code
4502 / 4512 ERR Package removal failed (computer / user)
4531 ERR Mounting an App Attach image failed, falling back to MSIX
4600 / 4601 / 4602 ERR Policy package invalid, policy processing failed (computer / user)
4610 / 4611 ERR Registry policy could not be set / taken back