Remotedesktop über WMI und PowerShell remote aktivieren

    RemotedesktopMicrosofts Remotedesktop ist nicht auf Terminal-Server beschränkt, sondern dient vielen Admins auch für die Fernwartung von Client-PCs. Dabei ist es oft notwendig, dieses Feature auf entfernten Rechnern erst zu aktivieren. Dies lässt sich über WMI erreichen.

    Um RDP-Verbindungen auf dem lokalen PC unter Windows 7/8 zuzulassen, bietet sich die Verwendung der entsprechenden Funktion in der System­steuerung an. Sie schaltet nicht nur dieses Feature frei, sondern aktiviert zudem die erforderlichen Firewall-Regeln.

    Möchte man Remotedesktop auf einer größeren Zahl von PCs aktivieren, also zum Beispiel auf allen Rechnern in einer OU oder Domäne, dann wird man dafür Gruppenrichtlinien verwenden (siehe dazu: Remotedesktop in Windows 7/8.x und Server 2012 (R2) mit GPO aktivieren).

    Will man Remotedesktop nur auf einzelnen entfernten PCs zulassen oder auf solchen, die nicht Mitglied in einer Domäne sind, dann bietet sich WMI als Alternative an. In Workgroup-Umgebungen sollte man vorher sicherstellen, dass sich der Remote-PC über WMI verwalten lässt.

    WMI-Aufruf über wmic

    Ziemlich einfach ist in diesem Fall der Aufruf des Kommandozeilenprogramms wmic, weil dieses ein vordefiniertes Alias namens RDToggle mitbringt. Es erlaubt im ersten Schritt, den Remotedesktop-Status abzufragen:

    wmic RDToggle get AllowTSConnections

    Um den Status von Remotedesktop zu ändern, ruft man die Funktion SetAllowTSConnections auf. Mit dem ersten Parameter lässt man RDP-Verbindungen zu, wenn er den Wert 1 hat. Mit 0 blockiert man Remotedesktop-Verbindungen, wobei bestehende Sessions unterbrochen werden.

    Der zweite Parameter legt fest, ob auf dem Zielrechner die Firewall-Regeln für Remotedesktop angepasst werden sollen. Folgender Aufruf aktiviert Remotedesktop plus die dazugehörige Firewall-Regel, um Verbindungen durchzulassen:

    wmic /node:<Name-des-PCs> RDToggle where ServerName="<Name-des-PCs>" call SetAllowTSConnections 1, 1

    Übergibt man die Parameter 0, 1 an SetAllowTSConnections, dann wird Remotedesktop deaktiviert und gleichzeitig die Firewall so zurückgesetzt, dass RDP-Verbindungen nicht durchgelassen werden.

    WMI mit PowerShell

    Alternativ zu wmic.exe kann man auch PowerShell verwenden, um Remotedesktop über WMI zu aktivieren. Zuständig ist dafür das Cmdlet Get-WmiObject, das über den Parameter -ComputerName auch entfernte Rechner ansprechen kann.

    Sein Aufruf ist komplizierter als der von wmic, weil mangels eines Alias der Namespace und die WMI-Klasse explizit angegeben werden müssen. Der Namespace root\cimv2\TerminalServices wurde mit Vista eingeführt, so dass der folgende Befehl nicht unter XP funktioniert:

    $RDC = Get-WmiObject -Namespace "root\cimv2\TerminalServices" `
    -Class win32_terminalservicesetting -ComputerName <Remote-PC>

    Nach dem Erzeugen des WMI-Objekts ruft man wie unter wmic.exe die Methode setAllowTSConnections auf, wobei die Parameter erwartungsgemäß die gleiche Bedeutung haben:

    $RDC.setAllowTSConnections(1,1)

    Ist der angezeigte Return-Code 0, dann ist die Operation geglückt. Man kann sich vom aktuellen Status durch den Aufruf von

    Get-CimInstance -Namespace "root\cimv2\TerminalServices" `
    -Class win32_terminalservicesetting -ComputerName |
    select ServerName, AllowTSConnections

    überzeugen.

    Der Aufruf von SetAllowTSConnections scheitert, wenn der RemoteDesktop-ZUgriff  bereits über ein GPO konfiguriert wird.

    Wenn der Aufruf von SetAllowTSConnections zur Fehlermeldung

    Exception calling "SetAllowTSConnections" : "Invalid operation "

    bzw. auf Deutsch

    Ausnahme beim Aufrufen von "SetAllowTSConnections": "Der Vorgang ist ungültig."

    führt, dann liegt das mit großer Wahrscheinlichkeit daran, dass diese Einstellung bereits über die Gruppenrichtlinien gesetzt wird und sich daher nicht über WMI ändern lässt.

    2 Kommentare

    CorvusNiger sagt:
    20. Dezember 2019 - 12:30

    Im Artikel sind meines Erachtens zwei kleine Fehler im Abschnitt zur Powershell: Die Aktivierung erfolgt mit $RDC.setAllowTSConnections(1,1) und nicht (0,1). Die Kontrolle kann erst über die Variable durchgeführt werden, nachdem das WMI-Objekt erneut eingelesen wurde, ansonsten enthält sie den Ausgangswert.

    Bild von Wolfgang Sommergut
    20. Dezember 2019 - 15:00

    Danke für den Hinweis! Klar, (0,1) deaktiviert auch bei PowerShell den RemoteDesktop-Zugriff, das muss natürlich (1,1) heißen. Habe ich korrigiert und für die Kontrollabfrage Get-CimInstance aufgerufen.