← All notes
Windows

Veyon from Windows WORKGROUP to Active Directory clients: authentication, troubleshooting and GPO deployment

A Veyon 4.11.3 case study: a non-domain Windows Master, matching local credentials, Security 4625, access-control rules, DNS redirection and PowerShell/GPO deployment v1.3.

Status: currentPublished: 2026-10-16Updated: 2026-10-17

Tested on: Veyon 4.11.3 · Windows 11 WORKGROUP · Windows 10/11 AD clients · Active Directory · PowerShell 5.1 · Group Policy Preferences

Scenario and scope

We needed to access Windows domain-joined workstations through Veyon Master running on a Windows 11 computer outside Active Directory (WORKGROUP). In the same infrastructure, Veyon Service was being deployed to AD workstations by GPO and PowerShell. In October 2026, we restored the connection from WORKGROUP and verified several automated deployment batches.

This case concerns Windows, not the previous Ubuntu Veyon without domain join case.

All internal names, hostnames, accounts, groups, OUs, addresses and domains are anonymized. Commands are illustrative and contain no production passwords. The actual Install-Veyon-v1.3.ps1 source has since been reviewed. The article now includes an anonymized reference template. This template is intentionally not deployment-ready: its SHA256 values, domain, operator group and approved networks are placeholders. It is neither a verbatim production script nor a universal safe installer.

Architecture

Windows 11 / WORKGROUP
  Veyon Master 4.11.3
  local operator1 account
        |
        +---- DNS -> AD workstation names
        +---- LDAPS :636 -> Active Directory objects
        +---- TCP/11100 -----------------------------+
                                                     |
                                        Windows / AD domain member
                                        Veyon Service 4.11.x
                                        Logon authentication
                                        Access Control based on AD group
                                                     |
                                              AD / Domain Controller

Deployment (domain-joined clients only):
GPO -> Scheduled Task (SYSTEM) -> Install-Veyon-v1.3.ps1 -> EXE/config/service/firewall

Three independent mechanisms need to be checked: LDAP delivers a list of computers, Windows verifies the submitted credentials, and Veyon access-control rules decide whether an authenticated operator may connect.

1. What worked before the fix

We had already confirmed:

Nevertheless, Veyon Master failed to connect. Successful directory queries, network reachability, and even a successful net use are not proof that Veyon is presenting the intended Windows identity to the remote Service.

2. Fix DNS and routing before investigating authentication

The investigation first exposed a separate networking issue: a gateway DNS redirect intercepted DNS requests from the WORKGROUP segment. Once narrowly scoped exceptions were added for the AD DNS servers, internal workstation names resolved correctly.

Run on the Windows Veyon Master:

Resolve-DnsName pc01.ad.example.com
Resolve-DnsName dc01.ad.example.com
Test-NetConnection pc01.ad.example.com -Port 11100
Test-NetConnection dc01.ad.example.com -Port 636

Run on the target domain workstation:

Get-Service VeyonService -ErrorAction SilentlyContinue
Get-NetTCPConnection -LocalPort 11100 -State Listen -ErrorAction SilentlyContinue

Check effective DNS resolvers and NAT rules rather than testing only raw IP connectivity. The DNS redirect was resolved before the authentication problem. Keep any gateway DNS exceptions restricted to the necessary systems and flows.

3. Domain credentials still failed from WORKGROUP

Trying CORP\operator1 and operator1@ad.example.com did not fix the connection. Security logs on the remote Windows host showed event 4625 (LogonType 3) for a different account rather than the expected domain operator.

The captured events included 0xC000006D (logon failure) and 0xC000006A (wrong password for the specified user). At this point the failure was no longer a transport problem; it was related to the effective account context used for authentication.

We also observed another distinct failure stage: Veyon reported successful VNC authentication, but its Access Control subsequently denied the connection because the evaluated identity did not satisfy the allowed-group condition.

Symptom Investigate
TCP/11100 is unavailable Service, host firewall, routing and ACLs
Security 4625 with a wrong user or password Actual username/domain received by the target
VNC authentication succeeded, then Access Control denied Effective identity and Veyon rules/group backend
LDAP works, remote control fails Authentication, authorization and remote service, not just LDAP

Investigate authentication events on the remote target host, correlating the timestamp and source address with a Veyon Master connection attempt.

4. The working fix: a matching local WORKGROUP account

A local account operator1 was created on the non-domain Windows computer running Veyon Master, with the same username and password as the intended domain operator. Connections to the AD-joined workstations then succeeded.

This is consistent with Veyon’s Logon authentication model: the Master sends the provided identity/credentials to the remote Service, which asks the remote OS to validate them. Veyon’s documentation points out the requirement for matching account credentials across machines in this mode.

This does not establish domain trust. The local user does not become an AD principal. Without inspecting the successful 4624 event and the effective group/identity used by Veyon on the target, we cannot claim which exact Windows authentication resolution path was used in every session. The positive connection does not by itself prove that a broad access rule was not involved.

Security trade-off: duplicating a domain password in a local account is credential reuse and increases exposure. This is a verified site-specific workaround, not a recommended default for large deployments. For long-term administration, prefer a domain-joined management workstation or a carefully managed Veyon key-file authentication model with strict access to the private key. A domain password change does not automatically update the local account. Do not grant local administrator rights unless explicitly required.

5. Authentication versus Veyon Access Control

Domain group usage and group-restricted access were configured on the Windows client. A reported UserGroups/UseDomainUserGroups=true is not sufficient proof that the remote Veyon Service will treat a WORKGROUP local user as a member of a domain operator group.

Read the effective configuration on the remote computer:

$Cli = 'C:\Program Files\Veyon\veyon-cli.exe'
& $Cli config get 'UserGroups/Backend'
& $Cli config get 'UserGroups/UseDomainUserGroups'
& $Cli config get 'AccessControl/AccessRestrictedToUserGroups'

Some settings may be renamed or absent in a particular build. A non-existent or legacy key should not be treated as the confirmed root cause.

In Veyon Configurator → Access control, review the rule order, Accessing user is member of group condition, user-group backend and default deny behavior. Do not keep an unrestricted allow rule merely to make a connection test pass.

6. Analyze Windows Security events

Run on the target AD workstation after a connection attempt, with permissions to read its Security log:

$since = (Get-Date).AddMinutes(-10)
Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=4624,4625; StartTime=$since
} -ErrorAction SilentlyContinue | ForEach-Object {
    [xml]$xml = $_.ToXml()
    $fields = @{}
    foreach ($item in $xml.Event.EventData.Data) {
        $fields[$item.Name] = $item.'#text'
    }
    [pscustomobject]@{
        Time=$_.TimeCreated; EventId=$_.Id
        User=$fields.TargetUserName; Domain=$fields.TargetDomainName
        LogonType=$fields.LogonType; Status=$fields.Status
        SubStatus=$fields.SubStatus; SourceIP=$fields.IpAddress
    }
} | Format-Table -AutoSize

The most useful fields are TargetUserName, TargetDomainName, LogonType, Status and SubStatus. Not every 4624/4625 event is generated by Veyon: correlate timestamps, process and source. Redact user identifiers and network addresses before publishing any log output.

Review VeyonMaster.log on the Master and the Veyon/Windows logs available on the Service host. The log file names and paths depend on build and configuration; failure to find one guessed filename does not mean Veyon emitted no diagnostic data.

7. Review of the actual Install-Veyon-v1.3.ps1

An important correction: the installer is a Veyon EXE launched with /S /NoMaster, not an MSI. The script targets Windows 10/11 workstations only (CIM Win32_OperatingSystem.ProductType = 1) and runs through a GPO Scheduled Task as LOCAL SYSTEM. It deliberately skips Windows Server and domain controllers. It installs Veyon Service, not Master.

Layer 1: constrain execution

Layer 2: manifest and integrity

The script loads a NETLOGON manifest.json with required version 4.11.3.0. It pins SHA256 hashes for x64/x86 EXE packages and a configuration JSON. It validates hashes in the manifest, on the network share and again after local copying. It also checks the installer via Get-AuthenticodeSignature for Status = Valid and the expected signer subject of Veyon Solutions.

A signer subject comparison is not the same as pinning a certificate thumbprint; normal code-signing trust and source control still matter.

\\ad.example.com\NETLOGON\Software\Veyon\
├── manifest.json
├── Packages\...
├── Config\...
└── Scripts\Install-Veyon-v1.3.ps1

Layer 3: v1.3 corrects installer-process handling

Version v1.3 starts the EXE with .NET System.Diagnostics.ProcessStartInfo, UseShellExecute = false, CreateNoWindow = true, a 600-second timeout, and strict exit-code checking. A stalled process is terminated where possible and logged. This addressed the installer execution problems observed with the earlier v1.2 approach.

This script is not a general automatic updater: it deliberately refuses an already-installed version other than 4.11.3.0 and requires manual upgrade review before changing pinned hashes, config and upgrade procedure.

Layer 4: restrict exposure during deployment

Before first installation, the script adds a temporary inbound Block TCP/11100 rule, imports vetted JSON, disables other enabled Veyon-related inbound Allow rules and creates its own limited Allow TCP/11100 rule restricted to approved source addresses. It leaves unrelated firewall rules untouched.

It then ensures VeyonService is automatic and running, checks veyon-cli.exe version, effective configuration and firewall. Only after verification does it remove the temporary block. If deployment fails, the block intentionally remains active and must not be removed without examining why validation failed.

The source also handles a Veyon 4.11.3 quirk: veyon-cli config get may return an empty server-port value while config export shows port 11100. Effective configuration is therefore exported to a temporary ACL-restricted directory (SYSTEM and Administrators only), inspected, and deleted.

Layer 5: idempotence and health checks

A rerun returns Already current; configuration, service and firewall checks OK only if the installed version, service status, stamped package/config hashes, restricted allow rule, effective Veyon configuration and absence of a temporary Block rule all match.

The state stamp is an additional check, not a replacement for checking the actual service and access-control configuration.

Client-side validation

$TaskName = 'Corp-Veyon-AutoDeploy' # example only
Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue |
    Select-Object TaskName, State, @{N='RunAs';E={$_.Principal.UserId}}
Get-ScheduledTaskInfo -TaskName $TaskName -ErrorAction SilentlyContinue |
    Select-Object LastRunTime, LastTaskResult, NextRunTime
Get-Service VeyonService -ErrorAction SilentlyContinue
Get-NetFirewallRule | Where-Object DisplayName -Like '*Veyon*' |
    Select-Object DisplayName, Enabled, Direction, Action
Get-Content "$env:ProgramData\Example\Veyon\deploy.log" -Tail 30 # example path

Pair LastTaskResult = 0 with the deploy log, service state and firewall. Task completion alone does not prove Veyon was configured as intended.

83 of 85 installations were confirmed in a validation batch. The two remaining workstations exhibited an installer launch issue (0xC0000142). After reboot and rechecking them, the Veyon Service was operational and the symptom did not recur, but the root cause of 0xC0000142 was not established. These observations do not imply permanent 100% fleet compliance.

The revised script was checked on both domain controllers and an idempotent rerun reported Already current on a sample domain workstation. GPO applies to domain-joined clients, not to the separate WORKGROUP Master.

The anonymized reference script Install-Veyon-v1.3-example.ps1 retains the operational logic, but deliberately contains invalid SHA256 placeholders and RFC 5737 example addresses. It is not ready to deploy without independent review and site-specific configuration.

8. Reusable read-only PowerShell diagnostics

The companion Veyon-Diagnostics.ps1 is a new, read-only diagnostic helper. It checks DNS, TCP/11100, local Veyon CLI, Veyon Service, selected configuration keys and Scheduled Task state. It does not create accounts, change firewall rules or install software.

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Veyon-Diagnostics.ps1 `
  -TargetHost pc01.ad.example.com -TaskName Corp-Veyon-AutoDeploy

To investigate 4624/4625 events, run the section 6 command on the remote Windows target. This helper is not a copy of production Install-Veyon-v1.3.ps1.

GitHub source code and version history

Veyon GPO Deployment — PowerShell scripts and documentation provides the current illustrative scripts/Install-Veyon.ps1, the read-only scripts/Veyon-Diagnostics.ps1, and the GPO deployment guide.

The history/ directory includes anonymized v1.0–v1.3 snapshots. See CHANGELOG.md for the verified differences between those stages.

Important: these are adapted public examples, not byte-for-byte copies of the production scripts. Artifact hashes and site-specific settings have intentionally been replaced. The modified versions have not been independently executed on Windows and must be reviewed before reuse.

Results and limits

References