Intune Enrollment Sorunlarını Kökten Temizleme (Entra Hybrid Join)
14 Haziran 2026 · 9 dk okuma
Sahadaki en can sıkıcı Intune sorunlarından biri: cihaz görünürde kayıtlı, portal da onu kayıtlı olarak gösteriyor, ama senkronizasyon çalışmıyor. Uygulamalar gelmiyor, politikalar uygulanmıyor. Yeniden kayıt denemesi de tutmuyor çünkü sistemde eski enrollment kalıntıları var.
Bunun en uç versiyonu omadmclient.exe’nin %100 CPU’ya yapışması — kullanıcı şikâyet ediyor, Task Manager’da süreç yanıp sönüyor, yeniden başlatınca aynı şey. Ama bu script sadece CPU sorunuyla sınırlı değil. MDM sync yanıt vermiyorsa, kayıt durumu bozulduysa ya da cihazı sıfırdan yeniden kaydetmeniz gerekiyorsa da işe yarıyor.
Script, Microsoft Entra Hybrid Join senaryosu için yazıldı. Cihaz hem on-premises Active Directory’e hem de Entra ID’ye join olmuş ortamları hedefliyor. Pure Azure AD Join veya sadece domain join cihazlarda çalışır ama asıl odak hybrid ortam.
Sorunun anatomisi
Intune enrollment tek bir yere iz bırakmıyor:
HKLM:\SOFTWARE\Microsoft\Enrollments\{GUID}— ana kayıtHKLM:\SOFTWARE\Microsoft\Provisioning\OMADM\*— OMADM oturum ve hesap bilgileri\Microsoft\Windows\EnterpriseMgmt\{GUID}— zamanlanmış görevler (omadmclient’ı bunlar tetikliyor)Cert:\LocalMachine\My— MDM cihaz sertifikaları
Bu dört noktadan biri tutarsız hâle geldiğinde sorun başlıyor. Elle temizlemek hem zaman alıyor hem de bir yeri atlamak çok kolay. Script hepsini sırayla kaldırıyor.
Script ne yapıyor?
İlk adım Azure AD join durumunu kontrol etmek. Hybrid cihazsa bunu not alıyor; sonraki adımların davranışı biraz farklılaşıyor.
Sonra omadmclient.exe ile IntuneManagementExtension servisini durduruyor. Aktif süreçler çalışırken kayıt silmek düzgün sonuç vermiyor.
Üçüncü adımda dikkat edilmesi gereken bir sıra var: dsregcmd /leave sertifika temizliğinden önce çalışıyor. Entra tarafındaki cihaz kaydını silebilmek için cihaz sertifikasının o anda yerinde olması gerekiyor. Önce sertifika silinir, sonra /leave çalıştırılırsa lokal temizlik yapılır ama Entra’da hayalet kayıt kalır.
Sonraki adım GUID tespiti. Script ProviderID = "MS DM Server" veya manage.microsoft.com URL’si eşleşmesi arıyor. Cihazda başka MDM sağlayıcısı varsa ona dokunmuyor. Tespit edilen her GUID için sekiz farklı registry konumunu, zamanlanmış görev klasörlerini ve MDM sertifikalarını kaldırıyor. En sonda kaç görev, sertifika ve enrollment kaydı kaldığını sayıp yazdırıyor.
Tüm işlemler C:\ProgramData\IntuneReset\ altına tarih damgalı bir log dosyasına yazılıyor.
Çalıştırmadan önce
Yönetici (elevated) PowerShell gerekiyor. SYSTEM bağlamı daha sağlıklı çalışıyor, mümkünse psexec veya Intune script kanalıyla gönderin.
Script Intune portaldaki cihaz kaydını silmiyor. Gerekirse onu portal üzerinden ayrıca kaldırın.
Büyük ortamlarda önce bir test cihazında deneyin.
-WhatIf ile neyin hedefleneceğini görmek için:
powershell -ExecutionPolicy Bypass -File .\Reset-IntuneEnrollment.ps1 -WhatIf
Gerçek temizlik:
powershell -ExecutionPolicy Bypass -File .\Reset-IntuneEnrollment.ps1
Script bittikten sonra yeniden başlatmak şart. Bazı OMADM anahtarları ancak reboot’ta tam temizleniyor.
Script çıktısı
[*] Azure AD Join durumu doğrulanıyor (dsregcmd /status)… [+] AzureAdJoined : YES [+] DomainJoined : YES (Hybrid)
[*] MDM süreçleri ve servisleri durduruluyor… -> omadmclient.exe sonlandırıldı (varsa). -> IntuneManagementExtension durduruldu.
[*] Cihaz enrollment/AAD durumu sıfırlanıyor (dsregcmd /debug /leave)… [+] dsregcmd /leave başarıyla çalıştırıldı (cloud kaydı silinmiş olmalı).
[*] Intune enrollment GUID’leri tespit ediliyor (registry + task klasörleri)… [+] Tespit edilen GUID sayısı: 1 -> 8a3f****-****-6f7a-8b9c-****2f3a4b5c [Registry (ProviderID=MS DM Server) + Task klasörü (4 görev)]
[*] GUID temizleniyor: 8a3f****-****-6f7a-8b9c-****2f3a4b5c -> Zamanlanmış görevler ve EnterpriseMgmt klasörü kaldırılıyor… -> ‘\Microsoft\Windows\EnterpriseMgmt\8a3f****…’ içinde 4 görev bulundu, siliniyor (geçiş 1)… [+] Task klasörü silindi: \Microsoft\Windows\EnterpriseMgmt\8a3f****-****-6f7a-8b9c-****2f3a4b5c -> Registry anahtarları siliniyor… [+] Silindi: HKLM:\SOFTWARE\Microsoft\Enrollments\8a3f****-****-6f7a-8b9c-****2f3a4b5c [+] Silindi: HKLM:\SOFTWARE\Microsoft\Enrollments\Status\8a3f****-****-6f7a-8b9c-****2f3a4b5c [+] Silindi: HKLM:\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts\8a3f****-****-6f7a-8b9c-****2f3a4b5c [+] Silindi: HKLM:\SOFTWARE\Microsoft\Provisioning\OMADM\Sessions\8a3f****-****-6f7a-8b9c-****2f3a4b5c
[*] Intune/MDM sertifikaları temizleniyor… [+] Sertifika silindi: CN=7a2b****… [A1B2****…****F890]
[*] Sonuç durumu kontrol ediliyor… -> Kalan EnterpriseMgmt görevi : 0 -> Kalan MDM sertifikası : 0 -> Kalan Intune enrollment : 0
[*] Güncel join durumu (dsregcmd /status): -> AzureAdJoined : NO -> DomainJoined : YES
[+] Temizlik tamamlandı. Cihaz Intune kayıtlarından arındırıldı. [!] Değişikliklerin tam oturması için cihazı YENİDEN BASLATIN.
İşlem tamamlandı. Detaylı log: C:\ProgramData\IntuneReset\Reset-IntuneEnrollment_20250603_143022.log
GUID satırının yanında [Registry ... + Task klasörü (4 görev)] yazıyorsa her iki kaynaktan bulunmuş demektir. Sadece birinde çıkıyorsa yalnızca o temizleniyor.
Script
[CmdletBinding(SupportsShouldProcess = $true)]
param()
function Write-Step { param($m) Write-Host "`n[*] $m" -ForegroundColor Cyan }
function Write-Ok { param($m) Write-Host " [+] $m" -ForegroundColor Green }
function Write-Warn2 { param($m) Write-Host " [!] $m" -ForegroundColor Yellow }
function Write-Info { param($m) Write-Host " -> $m" -ForegroundColor Gray }
function Remove-ScheduledTaskFolderRecursive {
param(
[Parameter(Mandatory)] $RootService,
[Parameter(Mandatory)] [string]$FolderPath
)
try { $folder = $RootService.GetFolder($FolderPath) } catch { return $true }
$maxPass = 10
for ($pass = 1; $pass -le $maxPass; $pass++) {
$tasks = @($folder.GetTasks(1))
if ($tasks.Count -eq 0) { break }
Write-Info " '$FolderPath' içinde $($tasks.Count) görev bulundu, siliniyor (geçiş $pass)..."
foreach ($tk in $tasks) {
try { $folder.DeleteTask($tk.Name, 0) }
catch { Write-Warn2 " Görev silinemedi: $($tk.Name)" }
}
Start-Sleep -Milliseconds 300
}
foreach ($sub in @($folder.GetFolders(0))) {
Remove-ScheduledTaskFolderRecursive -RootService $RootService -FolderPath $sub.Path | Out-Null
}
$remaining = @($folder.GetTasks(1)).Count
if ($remaining -gt 0) {
Write-Warn2 " '$FolderPath' içinde hâlâ $remaining görev var, klasör silinemiyor."
return $false
}
$parent = Split-Path $FolderPath -Parent
$leaf = Split-Path $FolderPath -Leaf
try {
$RootService.GetFolder($parent).DeleteFolder($leaf, 0)
Write-Ok "Task klasörü silindi: $FolderPath"
return $true
} catch {
Write-Warn2 " Klasör silinemedi: $FolderPath ($($_.Exception.Message))"
return $false
}
}
# Yönetici kontrolü
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Error "Yönetici yetkisi gerekli."
exit 1
}
$logDir = "$env:ProgramData\IntuneReset"
if (-not (Test-Path $logDir)) { New-Item -Path $logDir -ItemType Directory -Force | Out-Null }
$logFile = Join-Path $logDir ("Reset-IntuneEnrollment_{0:yyyyMMdd_HHmmss}.log" -f (Get-Date))
try { Stop-Transcript -ErrorAction SilentlyContinue | Out-Null } catch {}
$script:TranscriptActive = $false
try {
Start-Transcript -Path $logFile -Force -ErrorAction Stop | Out-Null
$script:TranscriptActive = $true
} catch {
Write-Warning "Transcript başlatılamadı: $($_.Exception.Message)"
}
Write-Host "Log: $logFile" -ForegroundColor DarkGray
# 1. Azure AD Join durumu
Write-Step "Azure AD Join durumu doğrulanıyor (dsregcmd /status)..."
$dsreg = & dsregcmd.exe /status
$azureAdJoined = ($dsreg | Select-String 'AzureAdJoined\s*:\s*YES') -ne $null
$domainJoined = ($dsreg | Select-String 'DomainJoined\s*:\s*YES') -ne $null
if ($azureAdJoined) { Write-Ok "AzureAdJoined : YES" } else { Write-Warn2 "AzureAdJoined : NO" }
if ($domainJoined) { Write-Ok "DomainJoined : YES (Hybrid)" } else { Write-Info "DomainJoined : NO" }
if (-not $azureAdJoined) {
Write-Warn2 "Cihaz Azure AD'ye join değil. Auto-enroll çalışmayabilir."
}
# 2. MDM süreçlerini durdur
Write-Step "MDM süreçleri ve servisleri durduruluyor..."
Get-Process -Name omadmclient -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
Write-Info "omadmclient.exe sonlandırıldı (varsa)."
$s = Get-Service -Name IntuneManagementExtension -ErrorAction SilentlyContinue
if ($s -and $s.Status -ne 'Stopped') {
Stop-Service -Name IntuneManagementExtension -Force -ErrorAction SilentlyContinue
Write-Info "IntuneManagementExtension durduruldu."
}
Start-Sleep -Seconds 2
# 3. dsregcmd /leave (sertifika temizliğinden ÖNCE)
Write-Step "Cihaz enrollment/AAD durumu sıfırlanıyor (dsregcmd /debug /leave)..."
if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "dsregcmd /debug /leave")) {
& dsregcmd.exe /debug /leave
if ($LASTEXITCODE -eq 0) { Write-Ok "dsregcmd /leave başarıyla çalıştırıldı." }
else { Write-Warn2 "dsregcmd /leave çıkış kodu: $LASTEXITCODE" }
Start-Sleep -Seconds 3
}
# 4. Intune GUID tespiti
Write-Step "Intune enrollment GUID'leri tespit ediliyor..."
$guidRegex = '[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}'
$candidateGuids = @{}
$enrollmentRoot = "HKLM:\SOFTWARE\Microsoft\Enrollments"
Get-ChildItem -Path $enrollmentRoot -ErrorAction SilentlyContinue |
Where-Object { $_.PSChildName -match "^\{?$guidRegex\}?$" } |
ForEach-Object {
$props = Get-ItemProperty -Path $_.PSPath -ErrorAction SilentlyContinue
$isIntune = ($props.ProviderID -eq 'MS DM Server') -or
($props.DiscoveryServiceFullURL -like '*manage.microsoft.com*') -or
($props.DiscoveryServiceFullURL -like '*dm.microsoft.com*')
if ($isIntune) {
$g = $_.PSChildName.Trim('{', '}')
$candidateGuids[$g] = "Registry (ProviderID=$($props.ProviderID))"
}
}
try {
$schDetect = New-Object -ComObject Schedule.Service
$schDetect.Connect()
$emFolder = $schDetect.GetFolder("\Microsoft\Windows\EnterpriseMgmt")
foreach ($sub in @($emFolder.GetFolders(0))) {
if ($sub.Name -match "^\{?$guidRegex\}?$") {
$g = $sub.Name.Trim('{', '}')
$taskCount = @($sub.GetTasks(1)).Count
if ($candidateGuids.ContainsKey($g)) { $candidateGuids[$g] += " + Task klasörü ($taskCount görev)" }
else { $candidateGuids[$g] = "Task klasörü ($taskCount görev)" }
}
}
} catch { Write-Warn2 "EnterpriseMgmt task klasörleri taranamadı: $($_.Exception.Message)" }
$intuneGuids = $candidateGuids.Keys | Sort-Object -Unique
if ($intuneGuids.Count -eq 0) {
Write-Warn2 "Temizlenecek Intune enrollment veya task klasörü bulunamadı (zaten temiz)."
} else {
Write-Ok "Tespit edilen GUID sayısı: $($intuneGuids.Count)"
foreach ($g in $intuneGuids) { Write-Info "$g [$($candidateGuids[$g])]" }
}
# 5. Her GUID için temizlik
$registryBases = @(
"HKLM:\SOFTWARE\Microsoft\Enrollments",
"HKLM:\SOFTWARE\Microsoft\Enrollments\Status",
"HKLM:\SOFTWARE\Microsoft\EnterpriseResourceManager\Tracked",
"HKLM:\SOFTWARE\Microsoft\PolicyManager\AdmxInstalled",
"HKLM:\SOFTWARE\Microsoft\PolicyManager\Providers",
"HKLM:\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts",
"HKLM:\SOFTWARE\Microsoft\Provisioning\OMADM\Logger",
"HKLM:\SOFTWARE\Microsoft\Provisioning\OMADM\Sessions"
)
foreach ($guid in $intuneGuids) {
Write-Step "GUID temizleniyor: $guid"
Write-Info "Zamanlanmış görevler ve EnterpriseMgmt klasörü kaldırılıyor..."
if ($PSCmdlet.ShouldProcess($guid, "Delete EnterpriseMgmt task folder")) {
try {
$sch = New-Object -ComObject Schedule.Service
$sch.Connect()
Remove-ScheduledTaskFolderRecursive -RootService $sch -FolderPath "\Microsoft\Windows\EnterpriseMgmt\$guid" | Out-Null
} catch { Write-Warn2 "Task Scheduler'a bağlanılamadı: $($_.Exception.Message)" }
$taskFsPath = "$env:WINDIR\System32\Tasks\Microsoft\Windows\EnterpriseMgmt\$guid"
if (Test-Path $taskFsPath) { Remove-Item -Path $taskFsPath -Recurse -Force -ErrorAction SilentlyContinue }
}
Write-Info "Registry anahtarları siliniyor..."
foreach ($base in $registryBases) {
$path = Join-Path $base $guid
if (Test-Path $path) {
if ($PSCmdlet.ShouldProcess($path, "Remove-Item")) {
Remove-Item -Path $path -Recurse -Force -ErrorAction SilentlyContinue
Write-Ok "Silindi: $path"
}
}
}
}
# 6. MDM sertifikaları
Write-Step "Intune/MDM sertifikaları temizleniyor..."
$mdmCerts = Get-ChildItem -Path Cert:\LocalMachine\My -ErrorAction SilentlyContinue |
Where-Object { $_.Issuer -match 'CN=Microsoft Intune MDM Device CA' -or $_.Issuer -match 'CN=SC_Online_Issuing' }
if ($mdmCerts) {
foreach ($c in $mdmCerts) {
if ($PSCmdlet.ShouldProcess($c.Thumbprint, "Remove MDM Cert")) {
Remove-Item -Path $c.PSPath -Force -ErrorAction SilentlyContinue
Write-Ok "Sertifika silindi: $($c.Subject) [$($c.Thumbprint)]"
}
}
} else { Write-Warn2 "Silinecek MDM sertifikası bulunamadı." }
# 7. Sonuç doğrulama
Write-Step "Sonuç durumu kontrol ediliyor..."
$remainingTasks = @(Get-ScheduledTask -TaskPath "\Microsoft\Windows\EnterpriseMgmt\*" -ErrorAction SilentlyContinue).Count
$remainingCerts = @(Get-ChildItem -Path Cert:\LocalMachine\My -ErrorAction SilentlyContinue |
Where-Object { $_.Issuer -match 'CN=Microsoft Intune MDM Device CA' }).Count
$remainingEnroll = @(Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft\Enrollments" -ErrorAction SilentlyContinue |
Where-Object { (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).ProviderID -eq 'MS DM Server' }).Count
Write-Info "Kalan EnterpriseMgmt görevi : $remainingTasks"
Write-Info "Kalan MDM sertifikası : $remainingCerts"
Write-Info "Kalan Intune enrollment : $remainingEnroll"
Write-Step "Güncel join durumu (dsregcmd /status):"
& dsregcmd.exe /status | Select-String 'AzureAdJoined|DomainJoined|DeviceId|MDMUrl' |
ForEach-Object { Write-Info $_.ToString().Trim() }
if ($remainingTasks -eq 0 -and $remainingCerts -eq 0 -and $remainingEnroll -eq 0) {
Write-Ok "Temizlik tamamlandı. Cihaz Intune kayıtlarından arındırıldı."
} else {
Write-Warn2 "Bazı kalıntılar mevcut. Cihazı yeniden başlatıp scripti tekrar çalıştırın."
Write-Warn2 "Bazı OMADM anahtarları için SYSTEM bağlamı gerekebilir (psexec -s)."
}
Write-Warn2 "Değişikliklerin tam oturması için cihazı YENİDEN BASLATIN."
if ($script:TranscriptActive) { try { Stop-Transcript | Out-Null } catch {} }
Write-Host "`nİşlem tamamlandı. Detaylı log: $logFile" -ForegroundColor Cyan
Sık karşılaşılan durumlar
dsregcmd /leave 0 dışında bir kod döndürürse genellikle ağ erişimi yoktur ya da sertifika zaten silinmiştir. Script devam ediyor, lokal temizlik yine yapılıyor.
Script sonunda kalan sayılar sıfır değilse cihazı yeniden başlatıp tekrar çalıştırın. Bazı OMADM anahtarları kilitli kalabiliyor ve bunlar sadece SYSTEM bağlamında siliniyor.
Hybrid join cihazlarda dsregcmd /leave Entra kaydını silse de domain join kalıyor. Cihaz yeniden enrollment sonrasında hybrid join sürecini kendi başına tamamlamalı; bu AAD Connect sync ve auto-enroll policy gerektiriyor.
SYSTEM bağlamında çalıştırmak için:
psexec -s powershell -ExecutionPolicy Bypass -File .\Reset-IntuneEnrollment.ps1