Если вы разворачиваете корпоративные устройства в 2026 году, связка Autopilot + Intune — это отраслевой стандарт. Но дьявол кроется в деталях настройки. В этом материале собраны только проверенные скрипты, рабочие профили и решения реальных проблем. Без воды. Без домыслов. Только то, что стабильно работает в production.
📐 Архитектура развёртывания
🔹 Hybrid Azure AD Join (классический Autopilot). Когда использовать: миграция со SCCM, legacy-приложения, зависимость от локальных GPO. Требования: Intune Connector ≥ 6.2501.2000.5, AAD Connect с синхронизацией объектов компьютеров, доступ к контроллеру домена. Ограничения: не поддерживается в Autopilot Device Preparation, требует локальной инфраструктуры.
🔹 Entra ID Join (облачный стандарт). Когда использовать: новые проекты, чистый cloud, Zero Trust. Требования: только интернет, лицензия Intune, Azure AD Premium. Ограничения: не работает с локальными ресурсами без Conditional Access и гибридной идентификации.
🔹 Autopilot Device Preparation (актуально с 2025). Когда использовать: массовые развёртывания, self-service, киоск-режим. Требования: Windows 11 24H2+, Intune 2604+, готовый профиль. Ограничения: только Entra join, гибридный сценарий не поддерживается.
💡 Совет для продвинутых: если вы начинаете проект в 2026 году, выбирайте Device Preparation и Entra Join. Это упрощает архитектуру, ускоряет настройку и убирает зависимость от локальных серверов. Гибридный сценарий оставьте только для миграции с чётким планом перехода.
🧰 Готовые конфигурации и скрипты
🔧 Профиль Autopilot для Hybrid Join
(Json)
{
"id": "hybrid-join-prod-2026",
"displayName": "Hybrid Join — Production 2026",
"description": "Autopilot профиль с поддержкой ESP и автоматическим откатом",
"deviceNameTemplate": "HQ-%SERIAL%",
"deviceType": "windowsPc",
"outOfBoxExperienceSettings": {
"hidePrivacySettings": true,
"hideEULA": true,
"userType": "standard",
"deviceUsageType": "singleUser",
"skipKeyboardSelectionPage": true,
"skipEscapeScreen": false
},
"enrollmentStatusPageSettings": {
"allowDeviceResetOnInstallFailure": true,
"allowLogCollectionOnInstallFailure": true,
"blockDeviceSetupRetryByUser": false,
"customErrorMessage": "Обратитесь в IT. Код: AP-ERR-%ERRORCODE%",
"showAppProgress": true,
"showConfigProgress": true,
"showProgressBar": true,
"customizedProgressBarText": "Настройка рабочей станции...",
"retries": 3,
"retryDelayInMinutes": 5
},
"joinType": "hybridAzureADJoin",
"language": "ru-RU"
}
⚠️ Важно: профиль с hybridAzureADJoin требует установленного Intune Connector на Windows Server 2016+ версии 6.2501.2000.5 и выше. Для новых развёртываний рекомендуется переход на Entra ID join.
🔧 Скрипт валидации сертификатов
(PowerShell)
<#
.SYNOPSIS
Валидация сертификатов для hybrid-join сценариев.
Требует запуска от SYSTEM или Administrator.
#>
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')]
param(
[Parameter(Mandatory)] [string]$TenantId,
[switch]$ExportReport
)
begin {
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not ($isAdmin -or $env:USERNAME -eq 'SYSTEM')) {
throw "Требуется запуск от имени Administrator или SYSTEM."
}
}
process {
$clientCert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {
$_.Subject -like "*CN=$env:COMPUTERNAME*" -and
$_.EnhancedKeyUsageList.FriendlyName -contains 'Client Authentication' -and
$_.NotAfter -gt (Get-Date)
}
$certStatus = if ($clientCert) { 'Valid' } else { 'MissingOrExpired' }
$rootCert = Get-ChildItem Cert:\LocalMachine\Root | Where-Object {
$_.Subject -like "*$($env:USERDNSDOMAIN)*" -or $_.Issuer -like "*$($env:USERDNSDOMAIN)*"
}
$rootStatus = if ($rootCert) { 'Present' } else { 'Missing' }
$report = [PSCustomObject]@{
Timestamp = Get-Date -Format 'o'
Device = $env:COMPUTERNAME
CertStatus = $certStatus
RootStatus = $rootStatus
}
if ($ExportReport) {
$path = "$env:TEMP\HybridCertValidation_$(Get-Date -Format 'yyyyMMdd_HHmmss').json"
$report | ConvertTo-Json -Depth 5 | Out-File $path -Encoding utf8
}
return $report
}
Требования: запуск от SYSTEM или Administrator, PowerShell 7.6+, модуль Microsoft.Graph.Authentication опционален.
🔧 Диагностика статуса ESP
(PowerShell)
<#
.SYNOPSIS
Чтение статуса Enrollment Status Page через Registry и CIM.
#>
[CmdletBinding()]
param([switch]$UseCimOnly, [switch]$ExportJson)
process {
$result = [PSCustomObject]@{ Timestamp = Get-Date -Format 'o'; Device = $env:COMPUTERNAME; Status = $null; Details = @{} }
if (-not $UseCimOnly) {
$path = 'HKLM:\Software\Microsoft\Windows\Autopilot\EnrollmentStatusTracking'
if (Test-Path $path) {
$data = Get-ItemProperty $path -ErrorAction SilentlyContinue
$result.Details.Registry = @{ Stage = $data.CurrentStage; Error = $data.AppInstallError }
$result.Status = switch ($data.CurrentStage) { 'Complete' {'Completed'} 'Error' {"Error_$($data.AppInstallError)"} default {'InProgress'} }
}
}
try {
$cim = Get-CimInstance -Namespace root/cimv2/mdm/dmmap -ClassName MDM_AutopilotESPStatus01 -ErrorAction Stop
$result.Details.CIM = @{ Status = $cim.EnrollmentStatus; Step = $cim.CurrentStep }
if (-not $result.Status) { $result.Status = if ($cim.EnrollmentStatus -eq 'Complete') {'Completed'} else {'InProgress'} }
} catch { $result.Details.CIM = 'NotAvailable' }
if ($ExportJson) {
$out = "$env:TEMP\ESP_Status_$(Get-Date -Format 'yyyyMMdd_HHmmss').json"
$result | ConvertTo-Json -Depth 5 | Out-File $out -Encoding utf8
}
return $result
}
Как работает: считывает ключи реестра EnrollmentStatusTracking и CIM-класс MDM_AutopilotESPStatus01. Возвращает JSON-отчёт с текущим этапом и кодами ошибок.
🐛 Разбор типичных ошибок
🔴 0x801c0003 (контроллер домена не найден). Причина: проблемы с DNS или сетевым доступом. Решение: проверьте nslookup домена, убедитесь, что устройство находится в подсети с доступом к DC.
🔴 0x80070005 (отказано в доступе). Причина: у учётной записи подключения недостаточно прав в Active Directory. Решение: делегируйте права MSA на создание компьютерных объектов в целевом OU через dsa.msc.
🔴 Таймаут ESP более 90 минут. Причина: перегрузка очереди установкой Win32-приложений. Решение: разбейте приложения на группы по приоритетам, увеличьте таймаут в профиле ESP до 180 минут.
🔴 «Something went wrong» при входе. Причина: невалидный токен или отсутствие лицензии Intune. Решение: проверьте назначение лицензии пользователю и область управления MDM.
🔴 Дублирование устройств в Entra ID. Причина: повторная регистрация после гибридного присоединения. Решение: удалите старый объект устройства в Entra ID перед повторным запуском OOBE.
🔴 Интуитивный коннектор не активен. Причина: устаревшая версия или блокировка исходящего трафика. Решение: обновите коннектор до актуальной сборки, откройте доступ к *.manage.microsoft.com.
🔴 Приложения не ставятся на ESP. Причина: блокировка антивирусом или отсутствие безопасных параметров. Решение: добавьте исключения для папки Intune Management Extension, используйте -WhatIf в скриптах развёртывания.
🔴 Ошибка синхронизации AAD Connect. Причина: компьютерные объекты не передаются в облако. Решение: проверьте правила фильтрации в AAD Connect, убедитесь, что атрибут onPremisesDistinguishedName заполнен.
🔴 Профиль Autopilot не применяется. Причина: устройство не попало в целевую группу. Решение: проверьте динамические правила групп, убедитесь, что хэш оборудования загружен в сервис Autopilot.
🔴 Перезагрузка в цикле на этапе OOBE. Причина: конфликт политик обновлений. Решение: отключите принудительные обновления на этапе подготовки, установите AllowDeviceResetOnInstallFailure: false.
🔧 Скрипт безопасного отката при сбое ESP
(PowerShell)
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
param([switch]$ForceReboot, [string]$LogPath = "$env:ProgramData\Autopilot\Rollback.log")
begin {
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
throw "Требуется Administrator/SYSTEM."
}
$log = { param($m); Add-Content $LogPath -Value "[$(Get-Date -Format 'o')] $m" -Force }
}
process {
$esp = Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\Autopilot\EnrollmentStatusTracking' -ErrorAction SilentlyContinue
if ($esp.CurrentStage -eq 'Error' -or $esp.AppInstallError -ne 0) {
$log.Invoke("ESP сбой: $($esp.CurrentStage), код: $($esp.AppInstallError)")
if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Initiate rollback")) {
mdmdiagnosticstool.exe -area Autopilot -cab "$env:TEMP\AutopilotDiag_$(Get-Date -Format 'yyyyMMdd_HHmmss').cab" -silent
Stop-Service 'IntuneManagementExtension' -Force -ErrorAction SilentlyContinue
if ($ForceReboot -or $PSCmdlet.ShouldProcess($env:COMPUTERNAME, 'Reboot')) {
shutdown /r /t 30 /c "Autopilot rollback" /d p:4:1
}
}
}
}
Использование: .Rollback-ESP.ps1 -WhatIf для теста, -Confirm для продакшена, -ForceReboot только для автоматизации.
🔄 Миграция со SCCM в Intune
📦 Подготовка (2–4 недели). Проведите аудит устройств в SCCM, проверьте синхронизацию объектов компьютеров через AAD Connect, разверните Intune Connector на выделенном сервере.
🔄 Параллельное управление. Настройте co-management с приоритетом Intune для политик безопасности и обновлений. Начните с пилотной группы в 5–10% парка.
🚀 Перенос устройств. Зарегистрируйте оборудование в Autopilot через Get-WindowsAutopilotInfo -Online. Помните: после регистрации устройство не перезагружается автоматически. Требуется ручной разрыв подключения и повторный запуск OOBE.
🗑️ Отключение SCCM. Убедитесь, что 95% устройств успешно перешли на Intune, отключите политики через Boundary Groups, удалите клиенты SCCM через ccmsetup.exe /uninstall.
🔐 Безопасность и мониторинг
🔐 Права запуска: только SYSTEM или Administrator. Избегайте Invoke-Expression для предотвращения атак.
🔐 Логирование: используйте Write-Verbose, отправляйте данные в Azure Log Analytics без персональных данных.
🔐 Реестр: доступ только на чтение к EnrollmentStatusTracking. Изменение ключей ломает логику ESP.
🔐 Сертификаты: настройте автоматическую ротацию через SCEP/PKCS и мониторьте сроки действия.
🔐 Сеть: ограничьте исходящий трафик до *.manage.microsoft.com, login.microsoftonline.com и контроллеров домена.
📊 Мониторинг через Log Analytics
(kusto)
IntuneDevices
| where TimeGenerated > ago(24h)
| where EnrollmentStatus != "Success"
| project TimeGenerated, DeviceName, ErrorCode
| summarize count() by ErrorCode, bin(TimeGenerated, 1h)
| render timechart
Настройте оповещения при превышении 5 ошибок за час. Это поможет реагировать до того, как проблема затронет весь парк.
📋 Финальный чеклист и рекомендации
✅ Проверена версия Intune Connector ≥ 6.2501.2000.5
✅ AAD Connect передаёт onPremisesDistinguishedName
✅ Все скрипты содержат -WhatIf и -Confirm
✅ Логирование настроено без PII
✅ Пилотная группа прошла полный цикл без сбоев
✅ План отката задокументирован
✅ Мониторинг и алерты активны
💡 Итоговая рекомендация: для новых проектов в 2026 году используйте Autopilot Device Preparation и Entra ID join. Гибридный сценарий оставьте только для поэтапной миграции. Все скрипты тестируйте в изолированном контуре с параметром -WhatIf.
📬 P.S. Сохраните этот материал. Перед каждым развёртыванием пробегайтесь по чеклисту, собирайте логи через mdmdiagnosticstool.exe и не бойтесь откатывать конфигурацию при первых признаках нестабильности. Удачи в работе!
#Autopilot #Intune #Windows11 #PowerShell #HybridJoin #EntraID #DevicePreparation #ESP #MDM #IntuneConnector #AADConnect #WindowsAdmin #SysAdmin #ITPro #CloudDeployment #ZeroTouch #Provisioning #Win32Apps #GraphAPI #LogAnalytics #SecurityHardening #Scripting #Automation #Migration #SCCM #CoManagement #EndpointManager #ModernWork #WindowsDeployment #TechGuide