En una implementación de Remote Desktop Services (RDS) en Windows Server 2022, es común publicar aplicaciones mediante RemoteApp
📌 Introducción
En una implementación de Remote Desktop Services (RDS) en Windows Server 2022, es común publicar aplicaciones mediante RemoteApp para que los usuarios puedan acceder a ellas de forma remota, sin necesidad de iniciar un escritorio completo. Aunque existen métodos automáticos como RD Web Access o el Web Feed de RemoteApp and Desktop Connections (RADC), hay escenarios donde:
-
RD Web Access no está disponible o falla.
-
Se requiere distribuir un
.rdpindividual para una aplicación específica. -
Se necesita generar los
.rdpde forma personalizada o automatizada sin intervención manual.
Este tutorial proporciona una forma sencilla y documentada de generar archivos .rdp para cada RemoteApp publicada en una colección, utilizando PowerShell y el módulo oficial de RDS (RemoteDesktop).
🧠 Requisitos previos
Antes de ejecutar los pasos, asegúrate de:
-
Tener instalada y configurada una implementación de RDS que incluya:
-
RD Connection Broker
-
RD Session Host
-
RD Licensing
-
-
Tener publicada al menos una aplicación RemoteApp en una colección.
-
Conocer:
-
El nombre de la colección (
CollectionName) -
El FQDN o hostname del Connection Broker
-
🔧 Objetivo
Generar archivos .rdp individuales para cada RemoteApp publicada en una colección RDS, que luego pueden distribuirse a usuarios para su ejecución directa sin necesidad de web feed ni portal web.
📝 Paso a paso: Generar archivos .rdp desde PowerShell
🔹 Paso 1: Abrir PowerShell como administrador
-
En el servidor RDS, abre PowerShell como administrador.
-
Asegúrate de tener importado el módulo de RDS (debería estar disponible por defecto en Windows Server 2022):
Import-Module RemoteDesktop
🔹 Paso 2: Definir los parámetros
Edita las siguientes variables según tu entorno:
# Nombre de la colección que contiene las RemoteApps
$Collection = "MiColeccion" # FQDN del RD Connection Broker $Broker = "rdcb.midominio.local"
# Carpeta donde se guardarán los archivos .rdp
$OutputFolder = "C:\RemoteApps"
# Crear la carpeta si no existe
if (-not (Test-Path $OutputFolder)) { New-Item -ItemType Directory -Path $OutputFolder }
🔹 Paso 3: Obtener las RemoteApps publicadas
Usamos el cmdlet Get-RDRemoteApp para obtener las aplicaciones asociadas a la colección:
$apps = Get-RDRemoteApp -CollectionName $Collection -ConnectionBroker $Broker
Este comando devolverá un listado de todas las RemoteApps, incluyendo sus alias (identificadores internos), nombres visibles, y configuraciones asociadas.
🔹 Paso 4: Generar los archivos .rdp
Recorremos cada aplicación y generamos un archivo .rdp mínimo funcional:
foreach ($app in $apps) {
$alias = $app.Alias
$rdpPath = Join-Path $OutputFolder "$alias.rdp"
# Contenido básico del archivo .rdp
$rdpContent = @"
screen mode id:i:2
session bpp:i:32
full address:s:$Broker
remoteapplicationmode:i:1
remoteapplicationname:s:$($app.DisplayName) remoteapplicationprogram:s:||$alias
prompt for credentials:i:1
authentication level:i:2
"@
# Guardar el archivo
$rdpContent | Out-File -FilePath $rdpPath -Encoding ASCII
Write-Host "Archivo generado: $rdpPath"
}
✅ Resultado
Al finalizar, tendrás un archivo .rdp por cada RemoteApp publicada, ubicado en la carpeta C:\RemoteApps. Cada archivo puede ser distribuido manualmente o por red a los usuarios finales.
Al ejecutar uno de estos archivos desde una estación cliente con acceso al servidor RDS, se abrirá directamente la aplicación remota.
💡 Información adicional
-
Formato
remoteapplicationprogram:s:||AppAlias: el doble pipe||es requerido por el protocolo RDP para indicar que es una aplicación publicada, no una ruta ejecutable. -
Broker vs Session Host: aunque técnicamente puedes usar la IP del Session Host en
full address:s:, se recomienda usar el FQDN del Connection Broker para que RDS distribuya correctamente la carga si hay múltiples hosts. -
Puedes agregar opciones adicionales al archivo
.rdp, como redirección de impresoras, audio, portapapeles, etc. -
Si algún usuario tiene problemas de certificados o advertencias de seguridad, asegúrate de que el servidor tenga un certificado SSL confiable asociado a RDS.
⚙️ Parámetros adicionales y cómo agregaros
A continuación tienes algunos parámetros frecuentes que podrías necesitar, con su descripción y un ejemplo de línea para incluirlos en tu bloque @""…""@ del script:
Parámetro RDP
Descripción
Ejemplo de línea
redirectprinters:i:
Redirige impresoras locales al servidor.
redirectprinters:i:1
redirectclipboard:i:
Habilita el portapapeles compartido.
redirectclipboard:i:1
redirectcomports:i:
Redirige puertos COM locales.
redirectcomports:i:0
redirectsmartcards:i:
Redirige lectores de smartcard.
redirectsmartcards:i:1
audiomode:i:
0 = Nada, 1 = Reproducir en cliente, 2 = Grabar.
audiomode:i:1
audiocapturemode:i:
Habilita captura de audio desde el cliente.
audiocapturemode:i:1
redirectposdevices:i:
Redirige dispositivos POS.
redirectposdevices:i:0
gatewayhostname:s:
FQDN de RD Gateway si lo utilizas.
gatewayhostname:s:gateway.midominio.local
gatewayusagemethod:i:
0 = No usar, 1 = Solo para RemoteApps, 2 = Solo para escritorios, 3 = Ambos.
gatewayusagemethod:i:1
workspace id:s:
Identificador del workspace (para algunos clientes).
workspace id:s:miWorkspace
loadbalanceinfo:s:
Información de balanceo de carga (usado internamente).
loadbalanceinfo:s:tswa-tcp:3351
authentication level:i:
0–3 nivel de seguridad (requerido por certificados).
authentication level:i:2
enablecredsspsupport:i:
0 = Deshabilitado, 1 = Habilitado (mejor soporte de credenciales).
enablecredsspsupport:i:1
🔧 Cómo incluirlos en tu script
Dentro del bucle foreach, modifica la variable $content para añadir tantas líneas como necesites. Por ejemplo, si quieres redirigir impresoras y portapapeles, y usar Gateway:
$content = @" screen mode id:i:2 session bpp:i:32 full address:s:$Broker remoteapplicationmode:i:1 remoteapplicationname:s:$display remoteapplicationprogram:s:||$alias prompt for credentials:i:1 authentication level:i:2 ; === Parámetros adicionales === redirectprinters:i:1 redirectclipboard:i:1 gatewayusagemethod:i:1 gatewayhostname:s:gateway.midominio.local enablecredsspsupport:i:1 "@
ℹ️ Tip:
-
Puedes comentar (líneas que empiecen con
;) para organizar tus parámetros. -
Mantén el orden lógico (redirecciones antes de gateway, etc.).
-
Si no necesitas un parámetro, déjalo con
:i:0o elimínalo del bloque.
📦 Consideraciones finales
Este método es ideal para:
-
Escenarios sin acceso a RD Web Access
-
Ambientes con clientes livianos o sin soporte de RADC
-
Distribución controlada de aplicaciones específicas
Aunque no es tan escalable como el feed web de RemoteApp and Desktop Connections, ofrece una solución rápida, clara y reutilizable para exportar .rdp sin depender de interfaces gráficas ni portales web.