← Все заметки
Windows

Veyon с Windows вне домена и компьютерами Active Directory: аутентификация, диагностика и развёртывание через GPO

Практический кейс Veyon 4.11.3: Windows WORKGROUP как Veyon Master, доменные клиенты, локальная учётная запись, ошибки 4625 и Access Control, DNS/NAT, PowerShell и GPO-развёртывание v1.3.

Статус: актуальноОпубликовано: 2026-10-16Обновлено: 2026-10-17

Проверено на: Veyon 4.11.3 · Windows 11 WORKGROUP · Windows 10/11 AD clients · Active Directory · PowerShell 5.1 · Group Policy Preferences

Задача и границы кейса

Требовалось управлять Windows-компьютерами, состоящими в Active Directory, через Veyon Master на Windows 11, который не включён в домен (WORKGROUP). В той же инфраструктуре Veyon Service развёртывался на доменных рабочих станциях через GPO и PowerShell. В октябре 2026 года удалось восстановить подключение из WORKGROUP, а также проверить отдельные партии автоматического развёртывания.

Этот кейс не про Ubuntu: интеграция Veyon Master на Ubuntu без realm join описана в отдельной статье.

Все имена серверов, компьютеров, домена, пользователей, групп и OU ниже заменены примерами. Показанные PowerShell-команды служат для проверки и не содержат производственных паролей. Теперь исходный PowerShell-скрипт Install-Veyon-v1.3.ps1 изучен отдельно; в публикацию включён обезличенный демонстрационный шаблон. Шаблон намеренно не готов к запуску: в нём отсутствуют реальные SHA256, домен, группа доступа и доверенные сети. Это не дословная копия рабочего файла и не универсальный безопасный установщик.

Схема

Windows 11 / WORKGROUP
  Veyon Master 4.11.3
  локальная учётная запись operator1
        |
        +---- DNS -> имена доменных компьютеров
        +---- LDAPS :636 -> AD (каталог, OU, компьютеры)
        +---- TCP/11100 -----------------------------+
                                                     |
                                        Windows / AD domain member
                                        Veyon Service 4.11.x
                                        Logon authentication
                                        Access Control по группе AD
                                                     |
                                              AD / Domain Controller

Контур развёртывания (только доменные клиенты):
GPO -> Scheduled Task (SYSTEM) -> Install-Veyon-v1.3.ps1 -> EXE/config/service/firewall

Три проверки нельзя смешивать: LDAP показывает список компьютеров; Windows проверяет переданные учётные данные; правила Veyon определяют, имеет ли аутентифицированный оператор право подключаться.

1. Что работало до исправления

До устранения проблемы было подтверждено:

Тем не менее подключение из Veyon Master отклонялось. Сетевая доступность, LDAP и даже успешный net use не означают, что Veyon передаёт на удалённый компьютер ту же учётную запись.

2. Сначала DNS и маршрутизация, затем аутентификация

В ходе диагностики обнаружилась отдельная сетевая причина: DNS redirect на шлюзе перехватывал запросы от недоменного сегмента. После добавления исключений для запросов к DNS-контроллерам домена стали корректно разрешаться имена внутренних рабочих станций.

На компьютере с 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

На целевом доменном ПК:

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

Проверяйте реально используемые DNS и правила NAT, а не только IP-доступность. Исключения DNS на маршрутизаторе следует ограничивать только необходимыми запросами и сетями. Проблема DNS была устранена раньше, чем проблема аутентификации.

3. Почему доменные реквизиты не сработали из WORKGROUP

Попытки указать пользователя как CORP\operator1 и operator1@ad.example.com не привели к нужному результату. При этом журнал Security на целевой Windows фиксировал события 4625 (LogonType 3) с другим именем пользователя, не соответствующим ожидаемому доменному оператору.

В тестовых событиях встречались 0xC000006D (ошибка входа) и 0xC000006A (неверный пароль для указанной учётной записи). Это указывало, что проблема уже перешла с уровня транспорта на уровень контекста проверяемой учётной записи.

Параллельно встречалась другая стадия отказа: Veyon фиксировал успешную VNC-аутентификацию, после чего Access Control отклонял доступ, поскольку проверяемая учётная запись не соответствовала условию членства в разрешённой группе. Это два разных диагноза:

Наблюдение Что проверять
TCP/11100 закрыт Служба, firewall, ACL и маршрутизация
Есть 4625, пароль/логин не принят Какая учётная запись и домен действительно попали на целевой ПК
VNC authentication succeeded, затем Access Control denied Эффективную идентичность пользователя и условия правил Veyon
LDAP показывает компьютеры, но Veyon не подключается Не LDAP, а аутентификацию/авторизацию или службу

События следует читать на целевом компьютере, где проходит проверка входа, сопоставляя метки времени с попыткой подключения из Master.

4. Сработавшее решение: совпадающая локальная учётная запись

На недоменном компьютере с Veyon Master создали локальную учётную запись operator1, соответствующую доменному оператору по имени и паролю. После этого подключение к доменным рабочим станциям заработало.

Объяснение согласуется с принципом Logon authentication: Veyon передаёт учётные данные на удалённую Veyon Service, где Windows выполняет проверку. Для работы в неоднородном окружении важна реальная идентичность, которую проверяет удалённая сторона. Документация Veyon также указывает необходимость согласованных пользовательских учётных записей/паролей для этого режима.

Чего этот тест не доказывает: локальная учётная запись не стала доменной, доверительные отношения между WORKGROUP и AD не появились. Без отдельного анализа успешного Security 4624 и эффективных групп нельзя утверждать, каким именно механизмом Windows сопоставила идентичность в каждой сессии. Нужно отдельно проверить, что целевая машина действительно авторизовала нужного доменного оператора, а не более широкое разрешающее правило.

Безопасность. Совпадающий пароль у локальной и доменной учётных записей увеличивает риск повторного использования учётных данных. Это локальное проверенное решение, а не рекомендуемый стандарт массового развёртывания. Для постоянной эксплуатации предпочтительны доменная рабочая станция администратора либо продуманная схема Veyon key-file authentication с защищённым доступом к закрытому ключу. При смене доменного пароля локальная копия не синхронизируется автоматически. Не добавляйте оператора в локальные Administrators, если это не требуется.

5. Как отделить ошибку Logon Authentication от Access Control

На доменном клиенте проверялись настройки Veyon, включающие использование групп домена и ограничение доступа группой операторов. Вывод UserGroups/UseDomainUserGroups=true сам по себе не гарантирует, что любой локальный пользователь распознаётся как член доменной группы.

Проверить установленную конфигурацию можно так:

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

Названия некоторых параметров зависят от версии и сборки; команда veyon-cli config get вернёт текущее значение либо диагностическую ошибку. Не следует интерпретировать устаревшие или несуществующие ключи как достоверную причину сбоя.

В Veyon Configurator → Access control проверяйте порядок правил, условие Accessing user is member of group, выбранный backend групп и поведение при отсутствии совпадения. В нормальной конфигурации доступ не должен открываться всем пользователям ради успешного теста.

6. Диагностика событий Windows

На целевом компьютере, в PowerShell с правами чтения журнала Security, непосредственно после попытки подключения:

$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

Нас интересуют TargetUserName, TargetDomainName, LogonType, Status и SubStatus. Помните, что не все события 4624/4625 вызваны Veyon: сопоставляйте время, источник и процесс. Полные журналы могут содержать имена пользователей/IP и требуют обезличивания перед публикацией.

На Master дополнительно смотрите VeyonMaster.log, на клиенте — доступные журналы Veyon и Windows; имя и расположение файлов логов зависят от настроек версии. Само отсутствие файла с предполагаемым именем — не доказательство отсутствия событий.

7. Разбор фактического Install-Veyon-v1.3.ps1

Важное уточнение: это EXE-установщик Veyon, который запускается с аргументами /S /NoMaster, не MSI. Скрипт рассчитан на Windows 10/11 (CIM Win32_OperatingSystem.ProductType = 1), запускается задачей GPO от LOCAL SYSTEM и сознательно не работает на Windows Server/контроллерах домена. Он устанавливает Veyon Service, но не Master.

Слой 1. Ограничение области применения

Слой 2. Репозиторий, manifest и защита от подмены

Скрипт читает manifest.json из NETLOGON и требует точную версию 4.11.3.0. В самом скрипте жёстко закреплены SHA256 для установщиков x64/x86 и конфигурационного JSON. Хеши сначала сверяются с manifest, затем с файлами на сетевой шаре и ещё раз — после копирования в локальный кэш. Установщик дополнительно проходит Get-AuthenticodeSignature: проверяется Status = Valid и ожидаемый субъект сертификата Veyon Solutions.

Это позволяет отсеивать повреждённый либо незапланированно заменённый дистрибутив. Однако проверка одного поля Subject не равна закреплению сертификата по thumbprint: доверие цепочке подписанта и поставщику пакета должно обеспечиваться штатной политикой. Результаты проверки нельзя переносить на произвольные сторонние EXE.

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

Слой 3. Установка и исправление зависаний v1.2

Ключевое изменение в v1.3 — запуск EXE через .NET System.Diagnostics.ProcessStartInfo с UseShellExecute = false, CreateNoWindow = true. Скрипт ожидает завершения максимум 600 секунд, затем проверяет ExitCode = 0; при таймауте пытается завершить процесс и фиксирует ошибку. Это заменило проблемный способ запуска из предыдущей редакции v1.2.

Новая версия не выполняет безусловный upgrade: обнаружив уже установленную Veyon другой версии, скрипт прекращает работу с сообщением manual upgrade review needed. Обновление до другой версии требует отдельного пересмотра manifest, хешей, конфигурации и процедуры upgrade.

Слой 4. Безопасное включение Veyon Service

Перед первой установкой создаётся временное правило Block TCP/11100 inbound. Затем импортируется проверенный JSON конфигурации, отключаются другие включённые входящие правила Allow, в названии которых обнаружено Veyon, и настраивается отдельное Allow TCP/11100 только для явно разрешённых адресов. Существующие посторонние правила firewall скрипт не трогает.

После этого он переводит VeyonService в Automatic, перезапускает службу, проверяет её состояние Running, версию veyon-cli.exe и эффективную конфигурацию. Только после успешной проверки снимается временная блокировка. При ошибке блокирующее правило остаётся, поэтому после сбоя важно читать журнал развёртывания, а не отключать правило вслепую.

Дополнительно обнаружен нюанс Veyon 4.11.3: veyon-cli config get может вернуть пустую строку для корректного Network/VeyonServerPort, хотя config export содержит 11100. Поэтому скрипт экспортирует эффективный JSON во временный каталог с ACL только для SYSTEM и Administrators, сверяет группу операторов, параметры доменных групп, firewall и порт, затем удаляет временный файл.

Слой 5. Идемпотентность

Повторная установка не нужна, только когда одновременно совпадают: версия, работа службы, контрольное состояние (версия/архитектура/хеши), точные параметры разрешающего правила firewall, экспортированная конфигурация и отсутствие временного Block-правила. Тогда журнал содержит:

Already current; configuration, service and firewall checks OK

Метка состояния — дополнительный контроль, не единственное доказательство корректной установки. При отклонении от ожидаемого состояния скрипт повторно применяет конфигурацию, правила и проверяет службу.

Проверки выполнения на доменной станции

$TaskName = 'Corp-Veyon-AutoDeploy' # имя для примера
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 # условный путь

LastTaskResult = 0 следует сопоставлять с содержимым лога и проверками службы/firewall: код задачи сам по себе не подтверждает, что нужная конфигурация применена.

В контрольной партии было подтверждено 83 из 85 установок. На двух оставшихся станциях имелись отдельные проблемы с запуском установщика (0xC0000142); после перезагрузки и повторной проверки Veyon Service работала, а ошибка не воспроизводилась. Первопричина 0xC0000142 не установлена. Эти результаты не следует превращать в утверждение о постоянном 100% охвате всех компьютеров.

Полезные результаты предыдущего этапа — проверка одинакового скрипта на обоих DC, повторный запуск с Already current, диагностика SYSVOL/NETLOGON и запуск задач под SYSTEM. GPO применяется к доменным рабочим станциям; WORKGROUP Master не получает такую политику.

Полный алгоритм можно изучить в публичном обезличенном примере Install-Veyon-v1.3-example.ps1. Он преднамеренно содержит невалидные SHA256 и RFC 5737-адреса, поэтому не может использоваться как есть.

8. Диагностический PowerShell-скрипт

Для воспроизводимой первичной проверки подготовлен отдельный read-only скрипт Veyon-Diagnostics.ps1. Он проверяет DNS, TCP/11100, наличие veyon-cli.exe, состояние службы, конфигурационные ключи и сведения о Scheduled Task. Он не создаёт пользователей, не меняет firewall и не запускает MSI.

Пример:

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

Для диагностики входов Security 4624/4625 используйте команду из раздела 6 непосредственно на целевом Windows-хосте. Производственный Install-Veyon-v1.3.ps1 — другой файл: в этой публикации не заявляется, что диагностический скрипт является его исходником или полной копией.

Исходный код и история изменений на GitHub

Veyon GPO Deployment — исходники PowerShell и документация — отдельный репозиторий с текущим демонстрационным scripts/Install-Veyon.ps1, диагностическим scripts/Veyon-Diagnostics.ps1 и инструкцией по настройке GPO.

В каталоге history/ опубликованы обезличенные версии v1.0–v1.3; точные изменения между ними описаны в CHANGELOG на русском.

Важно: это адаптированные публичные примеры, а не побайтовые копии production-скриптов. Контрольные суммы и параметры инфраструктуры намеренно заменены; перед применением требуется собственная проверка, а модифицированные версии не проходили отдельное тестирование на Windows.

Итоги и границы результата

Документация