skip to content

Recherche

Syspirit

RDS

Administration RDS et RemoteApps avec PowerShell - publier et gérer vos applications distantes !

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 RDSImport-Module RemoteDesktop
✅ Vérifier moduleGet-Module RemoteDesktop
🔍 Lister cmdlets RDSGet-Command -Module RemoteDesktop
📋 Aide cmdletGet-Help Get-RDRemoteApp -Examples

📱 Gestion des RemoteApps

📌 Action🧠 Commande PowerShell
📋 Lister RemoteApps collectionGet-RDRemoteApp -CollectionName "NOM_COLLECTION"
👁️ Détails RemoteAppGet-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "notepad"
🆕 Publier RemoteApp simpleNew-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "notepad" -DisplayName "Bloc-notes" -FilePath "C:\Windows\System32\notepad.exe"
🆕 Publier avec arguments obligatoiresNew-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "console_AD" -DisplayName "Console AD" -FilePath "C:\Windows\System32\mmc.exe" -CommandLineSetting Require -RequiredCommandLine "dsa.msc"
🔧 Modifier RemoteAppSet-RDRemoteApp -CollectionName "NOM_COLLECTION" -Alias "notepad" -DisplayName "Nouveau nom"
🗑️ Supprimer RemoteAppRemove-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 collectionsGet-RDSessionCollection
🔍 Détails collectionGet-RDSessionCollection -CollectionName "NOM_COLLECTION"
🆕 Créer collectionNew-RDSessionCollection -CollectionName "MaCollection" -SessionHost "serveur.domain.com"
🗑️ Supprimer collectionRemove-RDSessionCollection -CollectionName "MaCollection"

👥 Gestion des utilisateurs et groupes

📌 Action🧠 Commande PowerShell
👁️ Voir groupes autorisésGet-RDSessionCollectionConfiguration -CollectionName "NOM_COLLECTION" -UserGroup
➕ Ajouter groupe ADSet-RDSessionCollectionConfiguration -CollectionName "NOM_COLLECTION" -UserGroup "DOMAIN\Groupe"
🔐 Lister utilisateurs connectésGet-RDUserSession -CollectionName "NOM_COLLECTION"
🚪 Déconnecter utilisateurDisconnect-RDUser -HostServer "serveur" -UnifiedSessionID 2
📤 Logoff utilisateurInvoke-RDUserLogoff -HostServer "serveur" -UnifiedSessionID 2

🖥️ Gestion des serveurs RDS

📌 Action🧠 Commande PowerShell
📋 Lister serveurs hôtesGet-RDSessionHost
📊 État du serveurGet-RDSessionHost -SessionHost "serveur.domain.com"
🔧 Mode maintenance ONSet-RDSessionHost -SessionHost "serveur.domain.com" -NewConnectionAllowed No
✅ Mode maintenance OFFSet-RDSessionHost -SessionHost "serveur.domain.com" -NewConnectionAllowed Yes
📈 Sessions activesGet-RDUserSession -ConnectionBroker "broker.domain.com"

🔑 Licences RDS

📌 Action🧠 Commande PowerShell
📋 Lister licencesGet-RDLicenseConfiguration
🔍 État serveur licencesGet-WmiObject Win32_TSLicenseServer -ComputerName "serveur"
📊 Licences disponiblesGet-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_remoteapp

Exemple 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 manquantInstall-WindowsFeature RSAT-RDS-Tools
Erreur connexion brokerSpécifier -ConnectionBroker "fqdn"
RemoteApp invisibleVérifier -ShowInWebAccess $true
Permissions insuffisantesCompte 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 TermServLicensing

La 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)"