RDS (Remote Desktop Services) permet de publier des applications et bureaux distants depuis Windows Server vers des clients légers ou ordinateurs.
📦 Préparation du module
| 📌 Action | 🧠 Commande PowerShell |
|---|---|
| 📦 Importer module RDS | Import-Module RemoteDesktop |
| ✅ Vérifier module | Get-Module RemoteDesktop |
| 🔍 Lister cmdlets RDS | Get-Command -Module RemoteDesktop |
| 📋 Aide cmdlet | Get-Help Get-RDRemoteApp -Examples |
📱 Gestion des RemoteApps
| 📌 Action | 🧠 Commande PowerShell |
|---|---|
| 📋 Lister RemoteApps collection | Get-RDRemoteApp -CollectionName "NOM_COLLECTION" |
| 👁️ Détails RemoteApp | Get-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "notepad" |
| 🆕 Publier RemoteApp simple | New-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "notepad" -DisplayName "Bloc-notes" -FilePath "C:\Windows\System32\notepad.exe" |
| 🆕 Publier avec arguments obligatoires | New-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "console_AD" -DisplayName "Console AD" -FilePath "C:\Windows\System32\mmc.exe" -CommandLineSetting Require -RequiredCommandLine "dsa.msc" |
| 🔧 Modifier RemoteApp | Set-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "notepad" -DisplayName "Nouveau nom" |
| 🗑️ Supprimer RemoteApp | Remove-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "notepad" |
💡 Paramètres d’arguments :
-CommandLineSetting Require: l’argument est obligatoire au lancement-CommandLineSetting Allow: l’utilisateur peut ajouter des arguments-CommandLineSetting DoNotAllow: aucun argument autorisé (par défaut)-RequiredCommandLine "arg": définit l’argument à passer au programme
📦 Gestion des collections
| 📌 Action | 🧠 Commande PowerShell |
|---|---|
| 📋 Lister collections | Get-RDSessionCollection |
| 🔍 Détails collection | Get-RDSessionCollection -CollectionName "NOM_COLLECTION" |
| 🆕 Créer collection | New-RDSessionCollection -CollectionName "MaCollection" -SessionHost "serveur.domain.com" |
| 🗑️ Supprimer collection | Remove-RDSessionCollection -CollectionName "MaCollection" |
👥 Gestion des utilisateurs et groupes
| 📌 Action | 🧠 Commande PowerShell |
|---|---|
| 👁️ Voir groupes autorisés | Get-RDSessionCollectionConfiguration -CollectionName "NOM_COLLECTION" -UserGroup |
| ➕ Ajouter groupe AD | Set-RDSessionCollectionConfiguration -CollectionName "NOM_COLLECTION" -UserGroup "DOMAIN\Groupe" |
| 🔐 Lister utilisateurs connectés | Get-RDUserSession -CollectionName "NOM_COLLECTION" |
| 🚪 Déconnecter utilisateur | Disconnect-RDUser -HostServer "serveur" -UnifiedSessionID 2 |
| 📤 Logoff utilisateur | Invoke-RDUserLogoff -HostServer "serveur" -UnifiedSessionID 2 |
🖥️ Gestion des serveurs RDS
| 📌 Action | 🧠 Commande PowerShell |
|---|---|
| 📋 Lister serveurs hôtes | Get-RDSessionHost |
| 📊 État du serveur | Get-RDSessionHost -SessionHost "serveur.domain.com" |
| 🔧 Mode maintenance ON | Set-RDSessionHost -SessionHost "serveur.domain.com" -NewConnectionAllowed No |
| ✅ Mode maintenance OFF | Set-RDSessionHost -SessionHost "serveur.domain.com" -NewConnectionAllowed Yes |
| 📈 Sessions actives | Get-RDUserSession -ConnectionBroker "broker.domain.com" |
🔑 Licences RDS
| 📌 Action | 🧠 Commande PowerShell |
|---|---|
| 📋 Lister licences | Get-RDLicenseConfiguration |
| 🔍 État serveur licences | Get-WmiObject Win32_TSLicenseServer -ComputerName "serveur" |
| 📊 Licences disponibles | Get-WmiObject Win32_TSIssuedLicense -ComputerName "serveur" |
🛠️ Configuration .rdp pour RemoteApps
Pour créer un fichier .rdp personnalisé permettant de lancer une RemoteApp :
screen mode id:2
remoteapplicationmode:1
remoteapplicationprogram:s:|nom_de_l_application_remoteapp
remoteapplicationname:s:NOM AFFICHAGE
full address:s:fqdn du serveur rds
alternate shell:s:|nom_de_l_application_remoteappExemple concret :
screen mode id:2
remoteapplicationmode:1
remoteapplicationprogram:s:|notepad
remoteapplicationname:s:Bloc-notes
full address:s:rds.domain.com
alternate shell:s:|notepad📜 Scripts utiles
🚀 Publier RemoteApp avec console MMC
# Publier la console Active Directory Users & Computers
New-RDRemoteApp -CollectionName "NOM_DE_LA_COLLECTION" `
-Alias "console_AD" `
-DisplayName "Console AD - Ordinateurs Active Directory" `
-FilePath "C:\Windows\System32\mmc.exe" `
-CommandLineSetting Require `
-RequiredCommandLine "%SystemRoot%\System32\dsa.msc" `
-IconIndex 0📊 Audit des RemoteApps publiées
# Export de toutes les RemoteApps d'une collection
$collectionName = "NOM_DE_LA_COLLECTION"
$apps = Get-RDRemoteApp -CollectionName $collectionName
$apps | Select-Object Alias, DisplayName, FilePath, CommandLineSetting |
Export-Csv "C:\Temp\RemoteApps_$collectionName.csv" -NoTypeInformation
Write-Host "Export terminé : $($apps.Count) applications trouvées"👥 Rapport des sessions actives
# Liste détaillée des utilisateurs connectés
Get-RDUserSession -ConnectionBroker "broker.domain.com" |
Select-Object UserName, SessionState, HostServer, CollectionName, @{
Name="ConnectedTime"
Expression={(Get-Date) - $_.ConnectTime}
} |
Sort-Object ConnectedTime -Descending |
Format-Table -AutoSize🔐 Forcer déconnexion des sessions inactives
# Déconnecter les sessions inactives depuis plus de 2h
$maxIdleTime = (Get-Date).AddHours(-2)
Get-RDUserSession | Where-Object {
$_.IdleTime -ne $null -and $_.IdleTime -gt $maxIdleTime
} | ForEach-Object {
Write-Host "Déconnexion de $($_.UserName) - Inactif depuis $($_.IdleTime)" -ForegroundColor Yellow
Disconnect-RDUser -HostServer $_.HostServer -UnifiedSessionID $_.UnifiedSessionID -Force
}🚨 Troubleshooting
| 🆘 Problème | 🧠 Solution |
|---|---|
| Module RDS manquant | Install-WindowsFeature RSAT-RDS-Tools |
| Erreur connexion broker | Spécifier -ConnectionBroker "fqdn" |
| RemoteApp invisible | Vérifier -ShowInWebAccess $true |
| Permissions insuffisantes | Compte admin membre de “Remote Desktop Services” |
🔧 Problème de licences RDS
Si des erreurs d’installation de licences surviennent, il est possible de reconstruire la base avec la console Gestionnaire de licences. Si inefficace, forcer un nettoyage :
Option 1 : Supprimer les licences via PowerShell
# Lister les licences en cours
Get-WmiObject Win32_TSLicenseKeyPack |
Select-Object KeyPackId, ProductVersion, TypeAndModel, AvailableLicenses, IssuedLicenses |
Format-Table
# Supprimer une licence spécifique par son KeyPackId
$keypack = Get-WmiObject Win32_TSLicenseKeyPack | Where-Object {$_.KeyPackId -eq "ID_A_SUPPRIMER"}
$keypack.Delete()Option 2 : Supprimer toutes les licences Per User (⚠️ risqué)
# Lancer PowerShell en Admin sur le serveur de licences
$licences = Get-WmiObject Win32_TSIssuedLicense -Namespace 'Root/CIMv2' -Filter "LicenseStatus=0"
foreach ($licence in $licences) {
$licence.Delete()
}
Write-Host "Licences supprimées. Redémarrage du service de licences recommandé."Option 3 : Renommer le fichier de base de licences
Si la console ne démarre pas, renommer le fichier .edb pour reconstruire la base :
# Arrêter le service de licences
net stop TermServLicensing
# Renommer la base (sauvegarde)
Rename-Item "C:\Windows\System32\lserver\TLSLic.edb" -NewName "TLSLic.edb.bak"
# Redémarrer le service
net start TermServLicensingLa console devrait maintenant être à nouveau vierge et fonctionnelle.
📈 Monitoring RDS
# Vue d'ensemble du déploiement RDS
Write-Host "=== État RDS ===" -ForegroundColor Green
Write-Host "Collections: $((Get-RDSessionCollection).Count)"
Write-Host "RemoteApps publiées: $((Get-RDRemoteApp).Count)"
Write-Host "Sessions actives: $((Get-RDUserSession).Count)"
Write-Host "Serveurs hôtes: $((Get-RDSessionHost).Count)"