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.
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
Étape | Action à réaliser | Détails utiles |
---|---|---|
1. Déploiement RDS | Vé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 Directory | Supprimer l’objet ordinateur et tout lien de réplication dans Sites and Services. | Au besoin : repadmin /removelingeringobjects |
3. DNS | Effacer 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 / RDWeb | Dans 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 RemoteApp | Examiner 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. Registre | Sur 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 RDS | Redémarrer RD Gateway, World Wide Web Publishing Service et, si présent, RD Connection Broker. | Assure la prise en compte des nettoyages |
8. Contrôle | Vider 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
Emplacement | Exemple de symptôme | Commande 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 RemoteApp | Propriété gatewayhostname ou loadbalanceinfo figée | Rechercher « full address:s » et « gatewayhostname:s » |
ApplicationHost.config IIS | Chaînes de connexion ou variables d’environnement applicatives | Recherche plein‑texte du FQDN |
DNS conditionnel / enregistrements statiques | Résolution positive malgré l’objet AD supprimé | Get-DnsServerResourceRecord + nettoyage |
Scripts de logon / tâches planifiées | Montage de lecteur, ping ou test d’un vieux nom d’hôte | Audit des partages NETLOGON et des tâches |
Plan de validation robuste
- Journaux propres : zéro événement DCOM 10028 et RDWebAccess 5 pendant au moins une heure après reboot des services.
- Tests fonctionnels : accès via RD Gateway et portail RDWeb, lancement d’un RemoteApp, ouverture de session RDP, attribution de licences RDS.
- Résolution DNS :
Resolve-DnsName DELETED_SERVER
renvoie NXDOMAIN ou rien. - 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
- Retirer l’hôte du déploiement RDS (GUI ou PowerShell).
- Désinstaller les rôles RDS (RD Gateway, RD Web, Session Host, Broker, Licensing).
- Supprimer l’objet AD et les enregistrements DNS associés.
- Nettoyer IIS/RDWeb (variables, fichiers publiés) et mettre à jour les GPO.
- Vérifier le Registre et redémarrer les services.
- 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.