The estimated reading time 3 minutes
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.
Hallo.
Ist es möglich über dieses Skript auch Nachrichten ins Netzwerk (zB über eingabe des Adressbereiches) an alle zu schicken die aktiv sind?
Hallo,
leider ist das auf diese Weise nicht möglich.
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
Hi,
ich habe in der nächsten Zeit eine ähnliche Anforderung, deshalb wird es in den nächsten zwei bis drei Monaten vermutlich ein Update des Skriptes geben.
Viele Grüße
$Hostserver = (($uid).HostServer)
Send-RDUserMessage -HostServer $Hostserver -UnifiedSessionID $id -MessageTitle „messagetitel“ -MessageBody „text in your messagebox“
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
Hi Sascha,
vielen Dank für den Hinweis. Die Variable ist $rdsessionhost. Habe ich gerade in Github korrigiert. Ist bei mir vermutlich nicht aufgefallen, da ich in der Testumgebung nur einen Server hatte (Broker und SH auf einem).
Viele Grüße
Alex
[…] habt ihr meinen Artikel zum Thema RDS Meldungen für alle verbundenen Benutzer gelesen. Wer diese Funktion gerne permanent […]