RDS : corriger les erreurs DCOM 10028 et RDWebAccess ID 5 causées par un serveur supprimé

Votre déploiement RDS enregistre des erreurs DCOM 10028 et RDWebAccess ID 5 visant un hôte déjà retiré ? Suivez ce guide pas‑à‑pas pour traquer chaque référence résiduelle au « serveur fantôme » et restaurer un environnement propre, stable et silencieux côté journaux.

Sommaire

Vue d’ensemble de la question

Un déploiement Remote Desktop Services continue d’émettre des événements DCOM (ID 10028) et RDWebAccess (ID 5) qui tentent encore d’atteindre DELETED_SERVER.FAKEORG.com, alors que ce serveur a été dé‑provisionné. L’objectif est de localiser puis éliminer toutes les références restantes (RDS, AD, DNS, IIS/RDWeb, GPO, Registre, base RDCms…) afin d’arrêter définitivement ces tentatives.

Réponse & Solution

ÉtapeAction à réaliserDétails utiles
1. Déploiement RDSVérifier dans Gestionnaire de serveur › Services Bureau à distance que l’hôte n’apparaît plus comme RD Session Host, RD Gateway, RD Web Access ou Connection Broker.S’il est toujours listé :
Remove-RDServer -Server "DELETED_SERVER" -Role RDS-RD-SERVER -Force
2. Active DirectorySupprimer l’objet ordinateur et tout lien de réplication dans Sites and Services.Au besoin : repadmin /removelingeringobjects
3. DNSEffacer les enregistrements A/AAAA et SRV pointant vers le serveur supprimé puis purger le cache DNS.ipconfig /flushdns sur les contrôleurs et les serveurs RDS
4. IIS / RDWebDans IIS Manager : rechercher dans /RDWeb (Application Settings, fichier web.config) et les Application Pools toute URL ou variable contenant le nom du serveur supprimé ; supprimer ou corriger.Redémarrer IIS : iisreset
5. GPO & profils RemoteAppExaminer les GPO utilisateurs et ordinateurs : scripts de logon, paramètre DefaultTSGateway, packages .rdp ou .msi pré‑existants.Mettre à jour ou régénérer les fichiers RemoteApp
6. RegistreSur chaque serveur RDS restant : rechercher « DELETED_SERVER » dans HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server et HKLM\SOFTWARE\Microsoft\RDMS.Sauvegarder, puis supprimer les clés orphelines
7. Services RDSRedémarrer RD Gateway, World Wide Web Publishing Service et, si présent, RD Connection Broker.Assure la prise en compte des nettoyages
8. ContrôleVider les journaux, redémarrer la passerelle RDS et surveiller l’absence des événements 10028/5.Get-WinEvent -FilterHashtable @{LogName='System'; Id=10028}

Procédure détaillée et bonnes pratiques

Avant de commencer

  • Travaillez avec un compte disposant des droits d’administration sur AD, DNS, IIS et RDS.
  • Planifiez une fenêtre de maintenance si votre passerelle ou votre Broker est en production.
  • Effectuez des sauvegardes : Instantanés VM, export des GPO, export de zones DNS, sauvegarde de la base RDCms si vous utilisez WID/SQL.

Capturer l’« état des lieux »

Un cliché initial accélère le diagnostic et la validation finale :

# Événements 10028 (DCOM) sur 24h
Get-WinEvent -FilterHashtable @{LogName='System'; Id=10028; StartTime=(Get-Date).AddDays(-1)} |
  Select-Object TimeCreated, Id, ProviderName, MachineName, Message |
  Export-Csv C:\Temp\RDS-DCOM10028-Before.csv -NoTypeInformation

# Événements 5 (RDWebAccess) sur 24h

Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-WebAccess/Operational'; Id=5; StartTime=(Get-Date).AddDays(-1)} |
Select-Object TimeCreated, Id, ProviderName, MachineName, Message |
Export-Csv C:\Temp\RDS-RDWeb5-Before.csv -NoTypeInformation 

Nettoyer le déploiement RDS (couche logique)

Depuis un serveur Broker ou un serveur d’administration muni du module RemoteDesktop :

Import-Module RemoteDesktop

# Remplacez par le FQDN de votre Broker si nécessaire

$cb = "RDCB.FAKEORG.com"

# Inventaire des rôles connus du déploiement

Get-RDServer -ConnectionBroker $cb | Format-Table Server, Roles -Auto

# Si le serveur supprimé apparaît encore dans une liste de rôles, forcer sa suppression

Remove-RDServer -Server "DELETED_SERVER" -Role "RDS-RD-SERVER" -ConnectionBroker $cb -Force
Remove-RDServer -Server "DELETED_SERVER" -Role "RDS-WEB-ACCESS" -ConnectionBroker $cb -Force
Remove-RDServer -Server "DELETED_SERVER" -Role "RDS-GATEWAY" -ConnectionBroker $cb -Force
Remove-RDServer -Server "DELETED_SERVER" -Role "RDS-CONNECTION-BROKER" -ConnectionBroker $cb -Force

# Optionnel : si l’hôte était membre d’une collection RDSH

Get-RDSessionCollection -ConnectionBroker $cb | ForEach-Object {
Remove-RDSessionHost -SessionHost "DELETED_SERVER.FAKEORG.com" -CollectionName $_.CollectionName -ConnectionBroker $cb -Force -ErrorAction SilentlyContinue
} 

Vérifiez également RD Licensing : un ancien serveur configuré comme « License Server » peut générer des résolutions de nom intempestives. Mettez à jour le mode de licence et le(s) serveur(s) de licences dans la collection et/ou via GPO.

Nettoyer Active Directory

# Trouver et supprimer l’objet ordinateur (si toujours présent)
Get-ADComputer -Filter "Name -eq 'DELETED_SERVER'" -Properties * |
  Remove-ADComputer -Confirm:$false -ErrorAction SilentlyContinue

# Vérifier la réplication et les objets persistants (lingering)

repadmin /showrepl
repadmin /removelingeringobjects    /ADVISORY_MODE 

Contrôlez aussi les groupes liés à RDS (ex. TS Web Access Computers, groupes de sécurité utilisés par vos RAP/CAP). Supprimez l’hôte supprimé de toute appartenance résiduelle.

Nettoyer DNS

# Supprimer A/AAAA
Remove-DnsServerResourceRecord -ZoneName "FAKEORG.com" -RRType A -Name "DELETED_SERVER" -Force -ErrorAction SilentlyContinue
Remove-DnsServerResourceRecord -ZoneName "FAKEORG.com" -RRType AAAA -Name "DELETED_SERVER" -Force -ErrorAction SilentlyContinue

# Supprimer SRV (exemples)

Get-DnsServerResourceRecord -ZoneName "*msdcs.FAKEORG.com" -RRType SRV |
Where-Object { $*.RecordData.DomainName -like "*DELETED_SERVER*" } |
ForEach-Object { Remove-DnsServerResourceRecord -ZoneName "*msdcs.FAKEORG.com" -InputObject $* -Force }

# Purger les caches

ipconfig /flushdns 

Nettoyer IIS / RDWeb

Le processus w3wp.exe de RDWeb peut continuer à sonder des cibles héritées (Application Settings, web.config, règles de réécriture, fichiers .rdp publiés). Recherchez le nom d’hôte dans la racine RDWeb et la configuration IIS :

# Recherche dans les répertoires RDWeb habituels
$paths = @(
  "$env:SystemRoot\Web\RDWeb",
  "$env:SystemDrive\inetpub\wwwroot\RDWeb",
  "$env:ProgramFiles\Remote Desktop Web"
) | Where-Object { Test-Path $_ }

Get-ChildItem -Path $paths -Recurse -Include *.config,*.xml,*.rdp,*.json,*.ini,web.config -ErrorAction SilentlyContinue |
Select-String -Pattern "DELETED_SERVER" |
Select-Object Path, LineNumber, Line

# Lister la configuration RDWeb (si appcmd est présent)

& $env:SystemRoot\System32\inetsrv\appcmd.exe list config "Default Web Site/RDWeb" /config 

Après correction, redémarrez IIS :

iisreset

GPO et profils RemoteApp

Les stratégies peuvent pousser un DefaultTSGateway, des URL de flux RemoteApp, ou des scripts de logon référencés :

Import-Module GroupPolicy

$gpos = Get-GPO -All
foreach ($g in $gpos) {
$xml = [xml](Get-GPOReport -Guid $g.Id -ReportType Xml)
if ($xml.InnerXml -match "DELETED_SERVER") {
"{0} : référence trouvée" -f $g.DisplayName
}
}

# Rapport RSOP rapide sur un serveur RDS

gpresult /h C:\Temp\RSOP-RDS.html 

Regénérez les packages .rdp / .msi RemoteApp depuis le nouveau Broker/RDWeb et remplacez les anciens artefacts sur les partages ou portails internes.

Balayer le Registre (serveurs RDS restants)

$hints = @(
 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server',
 'HKLM:\SOFTWARE\Microsoft\RDMS',
 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services',
 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server'
)
foreach ($h in $hints) {
  if (Test-Path $h) {
    Get-ChildItem -Path $h -Recurse -ErrorAction SilentlyContinue |
      ForEach-Object {
        $p = $_.PSPath
        (Get-ItemProperty -Path $p -ErrorAction SilentlyContinue).PSObject.Properties |
          Where-Object { $_.Value -as [string] -and ($_.Value -match 'DELETED_SERVER') } |
          ForEach-Object { "{0} → {1} = {2}" -f $p,$_.Name,$_.Value }
      }
  }
}

Exportez toujours la clé avant suppression :

reg export "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" C:\Temp\TS.reg /y

Redémarrer les services pertinents

Restart-Service -Name "TSGateway","W3SVC" -Force
# Si Broker présent :
Restart-Service -Name "Tssdis","TermService" -Force -ErrorAction SilentlyContinue

Contrôler la disparition des événements

# Après nettoyage et redémarrage
Get-WinEvent -FilterHashtable @{LogName='System'; Id=10028; StartTime=(Get-Date).AddMinutes(-30)} |
  Measure-Object

Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-WebAccess/Operational'; Id=5; StartTime=(Get-Date).AddMinutes(-30)} |
Measure-Object 

Audit automatisé : script « tout‑en‑un »

Ce script génère un rapport consolidé listant où DELETED_SERVER apparaît (RDS, fichiers RDWeb, GPO, Registre, DNS, IIS) et crée un journal d’actions. Adaptez les chemins à votre environnement.

$Target = "DELETED_SERVER"
$Domain = "FAKEORG.com"
$Broker = "RDCB.FAKEORG.com"
$OutDir = "C:\Temp\RDS-Ghost-Audit"
New-Item -Path $OutDir -ItemType Directory -Force | Out-Null

Import-Module RemoteDesktop -ErrorAction SilentlyContinue
Import-Module DnsServer -ErrorAction SilentlyContinue
Import-Module GroupPolicy -ErrorAction SilentlyContinue

"=== RDS Roles ===" | Tee-Object "$OutDir\audit.txt" -Append
try {
Get-RDServer -ConnectionBroker $Broker | Tee-Object "$OutDir\RDS-Servers.csv"
} catch { "Module RemoteDesktop introuvable ou Broker injoignable" | Tee-Object "$OutDir\audit.txt" -Append }

"=== RDWeb files ===" | Tee-Object "$OutDir\audit.txt" -Append
$rdwebPaths = @("$env:SystemRoot\Web\RDWeb","$env:SystemDrive\inetpub\wwwroot\RDWeb") | ? { Test-Path $_ }
Get-ChildItem $rdwebPaths -Recurse -Include *.rdp,*.config,*.xml,web.config -ErrorAction SilentlyContinue |
Select-String -Pattern $Target |
Select Path, LineNumber, Line |
Export-Csv "$OutDir\RDWeb-Hits.csv" -NoTypeInformation

"=== DNS ===" | Tee-Object "$OutDir\audit.txt" -Append
Get-DnsServerResourceRecord -ZoneName $Domain -RRType A -ErrorAction SilentlyContinue |
Where-Object { $_.HostName -eq $Target } |
Export-Csv "$OutDir\DNS-A.csv" -NoTypeInformation

"=== GPO ===" | Tee-Object "$OutDir\audit.txt" -Append
$gpos = Get-GPO -All -ErrorAction SilentlyContinue
foreach ($g in $gpos) {
$xml = [xml](Get-GPOReport -Guid $g.Id -ReportType Xml)
if ($xml.InnerXml -match $Target) { "{0}" -f $g.DisplayName | Out-File "$OutDir\GPO-Hits.txt" -Append }
}

"=== Registry ===" | Tee-Object "$OutDir\audit.txt" -Append
$keys = @(
'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server',
'HKLM:\SOFTWARE\Microsoft\RDMS',
'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services'
) | ? { Test-Path $_ }
foreach ($k in $keys) {
Get-ChildItem -Path $k -Recurse -EA SilentlyContinue | ForEach-Object {
$p = $*.PSPath
(Get-ItemProperty -Path $p -EA SilentlyContinue).PSObject.Properties |
? { $*.Value -as [string] -and ($*.Value -match $Target) } |
% { "{0} → {1} = {2}" -f $p,$*.Name,$_.Value } | Out-File "$OutDir\Registry-Hits.txt" -Append
}
}

"=== IIS appcmd (si dispo) ===" | Tee-Object "$OutDir\audit.txt" -Append
$AppCmd = "$env:SystemRoot\System32\inetsrv\appcmd.exe"
if (Test-Path $AppCmd) {
& $AppCmd list config "Default Web Site/RDWeb" /config | Select-String $Target |
Out-File "$OutDir\IIS-Hits.txt" -Append
}
"=== FIN ===" | Tee-Object "$OutDir\audit.txt" -Append 

Base RDCms (WID/SQL) : nettoyage avancé et précautions

Dans certains environnements, des enregistrements demeurent dans la base de configuration RDCms (hébergée via Windows Internal Database ou SQL Server), notamment dans rds.Server. Recommandation : privilégiez toujours le retrait via PowerShell/GUI (Remove-RDServer). N’envisagez un nettoyage SQL qu’en ultime recours, avec sauvegarde intégrale et hors production.

Exemples de requêtes de diagnostic (lecture seule) :

-- WID : utilisez l'instance nommée via pipe nommée et base RDCms
-- Vérification des références au serveur supprimé
SELECT ServerId, ServerName, ServerFQDN, DecommissionTime
FROM   rds.Server
WHERE  ServerName LIKE '%DELETED_SERVER%' OR ServerFQDN LIKE '%DELETED_SERVER%';

-- Où ce serveur est-il encore lié (exemples) ?
SELECT * FROM rds.Role WHERE ServerId IN (SELECT ServerId FROM rds.Server WHERE ServerName='DELETED_SERVER');
SELECT * FROM rds.DeploymentSettings WHERE SettingValue LIKE '%DELETED_SERVER%'; 

Connexion typique avec sqlcmd si disponible :

sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -d RDCms -E -Q "SELECT COUNT(*) FROM rds.Server"

Si vous identifiez des entrées orphelines et que la suppression par cmdlet échoue, escaladez et documentez. La suppression directe de lignes peut briser des clés étrangères ou des états internes.

Autres cachettes fréquentes du nom de l’hôte

EmplacementExemple de symptômeCommande de vérification
Stratégies RD Gateway (CAP/RAP)RAP pointant des « Groupes d’ordinateurs » contenant l’hôte suppriméVérifier les cibles dans le Gestionnaire RD Gateway
Fichiers .rdp / packages RemoteAppPropriété gatewayhostname ou loadbalanceinfo figéeRechercher « full address:s » et « gatewayhostname:s »
ApplicationHost.config IISChaînes de connexion ou variables d’environnement applicativesRecherche plein‑texte du FQDN
DNS conditionnel / enregistrements statiquesRésolution positive malgré l’objet AD suppriméGet-DnsServerResourceRecord + nettoyage
Scripts de logon / tâches planifiéesMontage de lecteur, ping ou test d’un vieux nom d’hôteAudit des partages NETLOGON et des tâches

Plan de validation robuste

  1. Journaux propres : zéro événement DCOM 10028 et RDWebAccess 5 pendant au moins une heure après reboot des services.
  2. Tests fonctionnels : accès via RD Gateway et portail RDWeb, lancement d’un RemoteApp, ouverture de session RDP, attribution de licences RDS.
  3. Résolution DNS : Resolve-DnsName DELETED_SERVER renvoie NXDOMAIN ou rien.
  4. Surveillance : vue personnalisée dans Observateur d’événements filtrant System / 10028 et TerminalServices-WebAccess / 5.

Prévenir la récidive : procédure standard de dé‑provisionnement

  1. Retirer l’hôte du déploiement RDS (GUI ou PowerShell).
  2. Désinstaller les rôles RDS (RD Gateway, RD Web, Session Host, Broker, Licensing).
  3. Supprimer l’objet AD et les enregistrements DNS associés.
  4. Nettoyer IIS/RDWeb (variables, fichiers publiés) et mettre à jour les GPO.
  5. Vérifier le Registre et redémarrer les services.
  6. Contrôler l’absence d’événements 10028/5 et documenter l’intervention (date, scripts, preuves).

Points d’attention et informations complémentaires

  • Les événements DCOM 10028 proviennent fréquemment d’un w3wp.exe lié à RDWeb qui sonde encore des hôtes listés ; leur disparition confirme que la configuration est assainie.
  • Si vous utilisez la Windows Internal Database (WID) ou SQL Server pour le rôle RDMS, des entrées peuvent persister dans RDCms.rds.Server ; un nettoyage SQL ciblé et maîtrisé peut s’avérer nécessaire si l’outillage RDS ne suffit pas.
  • Formalisez un runbook de dé‑provisionnement : retrait via RDS, désinstallation des rôles, purge AD/DNS/IIS/GPO. C’est le meilleur anti‑recidive.

Exemples rapides supplémentaires

Forcer la suppression d’un RD Gateway orphelin côté déploiement RDS

Remove-RDServer -Server "DELETED_SERVER" -Role "RDS-GATEWAY" -ConnectionBroker "RDCB.FAKEORG.com" -Force

Retirer un enregistrement SRV faisant référence au serveur supprimé

Get-DnsServerResourceRecord -ZoneName "_msdcs.FAKEORG.com" -RRType SRV |
  Where-Object { $_.RecordData.DomainName -like "*DELETED_SERVER*" } |
  Remove-DnsServerResourceRecord -ZoneName "_msdcs.FAKEORG.com" -Force

Filtrer les derniers événements RDWebAccess ID 5

Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-WebAccess/Operational'; Id=5} |
  Select-Object TimeCreated, Message | Format-Table -Auto

Checklist de clôture

  • Toutes les références au FQDN/nombre NetBIOS de DELETED_SERVER supprimées.
  • Résolution DNS négative confirmée.
  • Rôles RDS et collections sans hôtes inconnus.
  • Flux RemoteApp republiés, GPO ajustées.
  • Services redémarrés, aucune réapparition de 10028/5.

En suivant cette méthode — du déploiement RDS jusqu’aux entrailles de RDCms — vous éliminez les causes de communications DCOM vers un serveur inexistant. Dans la majorité des cas, la suppression des restes IIS/RDWeb, la correction des paquets RemoteApp et le nettoyage DNS/AD suffisent ; la voie SQL reste exceptionnelle et doit être abordée avec précaution.

Sommaire