RDS/Terminalserver Nachricht an alle aktiven Benutzer schicken

The estimated reading time 3 minutes

LINK zum RDSMessenger

Innerhalb einer RDServer Umgebung (RemoteDesktop) früher auch bekannt als Terminalserver Umgebung kann es von Zeit zu Zeit notwendig sein, seine Benutzer zu informieren. Egal ob es eine Wartung oder ein allgemeines Problem gibt. Ich habe hierzu etwas gesucht, aber leider nichts wirklich passendes im Internet gefunden. Deshalb habe ich mich entschlossen selbst ein kleines Skript zu entwerfen, welches diesen Job erledigt.
Mit Windows Server 2012 wurde ein neues cmdlet eingeführt.

https://docs.microsoft.com/en-us/powershell/module/remotedesktop/send-rdusermessage?view=win10-ps

Send-RDUserMessage

Was soll erreicht werden:

Das cmdlet kann verwendet werden, nachdem dieses und die anderen RemoteDesktop cmdlets importiert wurden. Eine solche Nachricht wird nicht nur auf Desktopverbindungen, sondern auch in RemoteApps angezeigt. (RemoteDesktop Powershell Modul ist ab 2012 bereits vorinstalliert)

HINWEIS: wer den RD-Broker nicht kennt, kann diesen einfach über den Servermanager ermitteln. Dazu müssen alle RD-Server in den Servermanager verbunden werden (der ServerManager gibt an, welche Server noch fehlen). Danach kann der Broker über folgende Anzeige ermittelt werden:

Wie bereits erwähnt wird die Nachricht durch das cmdlet Send-RDUserMessage erstellt, allerdings kann dies nur für jeweils einen Benutzer getan werden. Deshalb hier mal die Kernzeilen meines Skriptes:

$broker = "FQDN of the Broker"
$userids = Get-RDUserSession -ConnectionBroker "$broker" | sort Username
foreach($uid in $userids){
            $id = (($uid).UnifiedSessionID)
             Send-RDUserMessage -HostServer $broker -UnifiedSessionID $id -MessageTitle "messagetitel" -MessageBody "text in your messagebox"
             }

Soweit funktioniert die Benachrichtigung schonmal, mit dem folgenden Skript bekommt man noch etwas mehr Rückmeldung und Ausgabe:

#fill message
$msgtitel = Read-Host "Type message titel"
$msg = Read-Host "Type message..."
$broker = Read-Host "Type FQDN of rd broker server"
#getting all user ids 
$userids = Get-RDUserSession -ConnectionBroker "$broker" | Sort-Object Username
$sessions = ($userids | Select-Object UserName,UnifiedSessionId)|Out-String
Write-host "Getting all active sessions on rd broker $broker" -ForegroundColor Yellow
Write-host "$sessions" -ForegroundColor Yellow
#send message to all user ids
foreach($uid in $userids){
            $id = (($uid).UnifiedSessionID)
            $user = (($uid).UserName)
            Send-RDUserMessage -HostServer $broker -UnifiedSessionID $id -MessageTitle "$msgtitel" -MessageBody "$msg"
            Write-Host "Sending message to user: $user with titel: $msgtitel" -ForegroundColor Green
}
pause

So sieht das Skript in Aktion aus:

Nach der kleinen Einführung, schauen wir noch auf einige Funktionen meines Skriptes bzw. dessen Parameter:

Beispiel 1: einfach nur ausführen

Beispiel 2: Ausführen mit Parametern
.\rdmessenger.ps1 -rdbroker rds02.demo01.it-koehler.com -messagetitel „admin message“ -message „message to display“ -Verbose

Beispiel 3: Ausführen mit dem Parameter -rdsessionhost
.\rdmessenger.ps1 -rdbroker rds02.demo01.it-koehler.com -messagetitel „admin message“ -message „message to display“ -rdsessionhost rds02.demo01.it-koehler.com

Weitere Funktionen des Skriptes:

  • überprüft die notwendigen Module
  • importiert die notwendigen Module
  • wartet 10 Sekunden bevor die Nachricht gesendet wird
  • für detaillierte Ausgabe kann der VERBOSE Befehl verwendet werden

Für weitere Infos kann man auch gerne die Kommentare im Skript anschauen.

Wer weitere Fragen hat kann diese gerne in der Kommentarleiste stellen. Sollte euch das Tool gefallen klickt einfach auf „Helpful“, wenn ihr Featureanfragen habt, einfach Kommentar da lassen. Viel Spaß beim Nachrichten senden.

Was this article helpful?
YesNo
0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest
8 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
RumbleStilzchen
RumbleStilzchen
3 Jahre zuvor

Hallo.
Ist es möglich über dieses Skript auch Nachrichten ins Netzwerk (zB über eingabe des Adressbereiches) an alle zu schicken die aktiv sind?

Stefan
Stefan
3 Jahre zuvor

Hallo. Ich möchte das Scirpt gerne von unseren Managment Server ausführen. Der Sessionbroker und Hosts Server sind getrennt installiert.

Bekomme immer diese Fehlermeldung:

Send-RDUserMessage : Failed to send message. Specified session does not exist.
At line:14 char:13
+            Send-RDUserMessage -HostServer $broker -UnifiedSessionID …
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   + CategoryInfo         : NotSpecified: (:) [Write-Error], WriteErrorException
   + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Send-RDUserMessage

Manfred Oertle
Manfred Oertle
Reply to  Stefan
3 Jahre zuvor

$Hostserver = (($uid).HostServer)
       Send-RDUserMessage -HostServer $Hostserver -UnifiedSessionID $id -MessageTitle „messagetitel“ -MessageBody „text in your messagebox“

Sascha
3 Jahre zuvor

Hallo, ich wollte dein Script einsetzen und habe einen Fehler darin festgestellt. Eine Ausführung ist so nicht möglich.
Du hast in den Zeilen 153 und 184 bei der Variable „Hostserver“ den Connectionbroker eingetragen. Hier muss die Variable $hostserver hin!
Viele Grüße
Sascha

trackback
5 Jahre zuvor

[…] habt ihr meinen Artikel zum Thema RDS Meldungen für alle verbundenen Benutzer gelesen. Wer diese Funktion gerne permanent […]