Powershell: Unpin App from Taskbar

Problem:
Ich habe nach einer Möglichkeit gesucht den Internet Explorer von der Taskleiste auf unseren Terminalservern zu entfernen und den Edge dafür zu setzen. Die Ernüchterung war, dass Unpin funktioniert, aber Pin nicht mehr unterstützt wird. Somit konnte ich zumindest den Internet Explorer von der Taskleiste entfernen.

Unpin App from Tasskbar

Deutsches OS
$appname = "Internet Explorer"
((New-Object -Com Shell.Application).NameSpace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').Items() | ?{$_.Name -eq $appname}).Verbs() | ?{$_.Name.replace('&','') -match 'Von Taskleiste lösen'} | %{$_.DoIt(); $exec = $true}


Englisches OS
$appname = "Internet Explorer"
((New-Object -Com Shell.Application).NameSpace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').Items() | ?{$_.Name -eq $appname}).Verbs() | ?{$_.Name.replace('&','') -match 'Unpin from taskbar'} | %{$_.DoIt(); $exec = $true}

RDS Terminalserver: Published App meldet beim Starten "Unbekannten Hersteller"

Problem:
Ich habe eine Published App für die Benutzer zur Verfügung gestellt und veröffentlich diese entweder über die RDWeb-Webseite des Terminalservers oder ich hänge die Apps direkt bei den Windows-Clients unter "Remote-App zugreifen" ein. Dabei wird beim Starten immer folgende Fehlermeldung angezeigt:


Lösung:
Zur Lösung müssen zwei Sachen umgesetzt werden:
1. Man muss das Zertifikate des RDS-Servers als "Vertrauenswürdige Stammzertifizierungsstelle" und als "Vertrauenswürdige Herausgeber" veröffentlichen (z.B. mittels GPO)
2.) Man muss den Thumbprint des veröffentliche Zertifikates als vertrauenswürdig einstufen (z.B. mittels GPO)

Also bauen Sie sich eine Zertifikats-GPO, soweit noch nicht vorhanden. Hierin importieren Sie das RDS-Zertifikat unter "Computerkonfiguration" -> "Windows-Einstellungen" -> "Sicherheitseinstellungen" -> "Richtlinien für öffentliche Schlüssel" unter den Punkten "Vertrauenswürdige Stammzertifizierungsstellen" und unter "Vertrauenswürdige Herausgeber".
Jetzt öffnen Sie das Zertifikat und kopieren sich den Thumprint unter den Eigenschaften heraus.
Diesen Thumprint fügen Sie dann in folgender GPO ein, um das Zertifikat vertrauenswürdig zu machen:
"Computerkonfiguration" -> "Administrative Vorlagen" -> "Windows-Komponenten" -> "Remotedesktopdienste" -> "Remotedesktopverbindungs-Client" ->"SHA1-Fingerabdruck von Zertifikaten angeben, die vertrauenswürdige RDP-Hersteller darstellen".

HINWEIS:
Der Thumbprint muss OHNE Leerzeichen eingegeben werden und mein 2016er-Server wollte unbedingt die Buchstaben als Großbuchstaben.

Zertifikate: Erstellen eines Self Signed Certificate mittels Powershell (z.B. RDS Published Apps)

Problem:
Ich habe eine Published App auf einem Server 2016 mit RDS. Für das Starten der App ohne Fehlermeldung benötige ich ein Zertifikat. Wenn ich das über die GUI erstelle, dann ist dieses immer nur 1 Jahr gültig. Das ist zwar sicherheitstechnisch korrekt, aber für eine Applikation für 10 Mitarbeiter jedes mal ein größerer Aufwand.

Lösung:
Ich erstelle auf dem RDS Server der Published App einfach ein Self Signed Certificate mittels Powershell mit entsprechenden Namen und angepasster Gültigkeitsdauer.

Hier der Befehl:
New-SelfSignedCertificate -Subject “server.domain.local” -DNSName “server.domain.local”, “rds.domain.local”, "Netbiosname Server" -CertStoreLocation “cert:\LocalMachine\My” -KeyAlgorithm RSA -KeyLength 2048 -KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(5)


Erklärungen:
DNSName: Hier geneben Sie alle FQDNs kommegetrennt an, über die der Server erriechbar sein soll. Nettes Feature...ich kann hier auch IP-Adressen und NetBIOS-Namen angeben, da ich nicht den Restriktionen einer öffentlichen Zertifikatsstelle unterliege.

-KeyExportPolicy: Das Zertifikat bzw. der private Schlüssel sollte exportierbar sein, falls man diesen sichern möchte.

-NotAfter: Hier kann man ein Gültigkeitsdatum des Zertifikats angeben. Ich selbst nehme immer den heutigen Tag (Get-Date) und Addiere x Jahre dazu (hier z.B. 5 Jahre).

Das Zertifikat verteile ich dann per GPO an alle Clients und setze noch den SHA1-Thumbprint als vertrauenswürdig um die unschöne Fehlermeldung zu unterdrücken.
Das habe ich hier erklärt: RDS Terminalserver: Published App meldet beim Starten "Unbekannten Hersteller"

Terminalserver/RDS 2016: Falscher Standarddrucker bei manchen Anwendungen

Problem:
Wir haben seit längerem das Problem, dass auf Terminalserver basierend auf Server 2016 der Standarddrucker nicht korrekt gesetzt wird. Das passiert aktuell inicht bei allen Anwendungen sondrn nur bei älteren Applikationen. Nach etwas Recherche hat sich herausgestellt, dass sich beim Server 2016 bzgl. des Standarddruckers in der Registry etwas geändert hat und einige ältere Applikationen den neuen Pfad nicht abfragen bzw. mit einer alten Routine hier den Standarddrucker ermitteln.

Ursache:
Früher war der Standarddrucker hier gesetzt:
HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Devices

Neu seit Server 2016 ist es dieser Pfad, der sich immer wieder ändert:
HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\SessionDefaultDevices\S-1-5-5-0-xxxxxxxxx

Lösung:
Da wir die problematischen Anwendungen nicht selbst ändern konnten und der Hersteller das Problem nicht lösen wollte/konnte, mussten wir uns etwas einfallen lassen. Ich habe hierzu ein Skript gefunden, welches den Standarddrucker aus dem neuen Pfad ausliest und dann im alten Pfad setzt.
Folgendes habe ich dazu eingerichtet:

1.) Das Skirpt zum Auslesen und Setzen des Standarddruckers:
Option Explicit
 On Error Resume Next
 Const HKCU = &H80000001
 Dim strComputer, objReg, strOrigPath, strNewPath, arrKeys, strKey, strPrinter

strComputer = "."
 Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
  strComputer & "\root\default:StdRegProv")
 strOrigPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows\SessionDefaultDevices"
 strNewPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows"

objReg.EnumKey HKCU, strOrigPath, arrKeys
 For Each strKey In arrKeys
     objReg.GetStringValue HKCU, strOrigPath & "\" & strKey, "Device", strPrinter
     If strPrinter <> vbNull Then
      objReg.SetStringValue HKCU, strNewPath, "Device", strPrinter
     End If
 Next

Set strComputer = Nothing
 Set objReg = Nothing
 Set strOrigPath = Nothing
 Set strNewPath = Nothing
 Set arrKeys = Nothing
 Set strKey = Nothing
 Set strPrinter = Nothing


Ich habe dann die Applikation über eine Batch-Datei starten lassen und darin das VBS zusätzlich laufen lassen:

REM Startskript für Applikation
start \\server\freigabe\anwendung.exe

REM Kurze Wartezeit um RDS-Session aufzubauen und Drucker zu mappen
ping 127.0.0.1 -n 10 > nul

REM Setzen des Default-Printers im Legacy Registrykey
start \\server\freigabe\set_printer.vbs


Quellen zur Lösung:
RemoteApp Default Printer Redirection Not Working in Server 2016
Default Printer not Mapped Properly within ICA Session

Terminalserver 2016 (RDS): PDF-Dateien können nicht mit dem Adobe Reader DC geöffnet oder gedruckt werden

Problem:
Nach der Installation des Adobe Readers DC auf einem Terminalserver 2016 konnten die PDFs aus dem eigenen TEMP-Ordner geöffnet werden. Mein erster Verdacht waren die neuen VHD-Profiles.

Lösung:
Des Rätsels Lösung war ganz einfach. Es ist der "Geschütze Modus" (Potected Mode) des Adobe Readers. Scheinbar macht das schon immer Probleme auf einem Terminalserver. Man kann die Funktion testweise bei einem Benutzer mal auscahlten:
- Wählen Sie Bearbeiten > Voreinstellungen.
- Wählen Sie auf der linken Seite unter Kategorien die Option Sicherheit (erweitert).
- Deaktivieren Sie im Abschnitt Sandbox-Schutz die Option Geschützten Modus beim Start aktivieren.

Um das Problem für alle Benutzer zu lösen, kann man einen Registry-Key per GPP ausstreuen:
Keypath: HKLM\SOFTWARE\Wow6432Node\Policies\Adobe\Acrobat Reader\DC\FeatureLockDown
Value name: bProtectedMode
Value type: REG_DWORD
Value data: 0

Damit wird der "geschützte Modus" deaktiviert und das Öffnen und Drucken soltle problemlos funktionieren!

Quelle: FAQ-O-MATIC: Terminalserver: Den Protected Mode des Adobe Reader X abschalten

RDP: Wie setzt man eine RDP-Sitzung remote zurück (cmd - Session Reset)

Problem:
Ich hatte eine RDP-Session, die sich "verrannt" hat und ich konnte auch keinen weiteren Benutzer mehr anmelden.
Stattdessen lese ich folgende Meldung beim Anmeldebildschirm:
"Der angeforderte Vorgang konnte nicht ausgeführt werden, da die Remotedesktopdienste derzeit ausgelastet sind. Versuchen Sie es in einigen Minuten noch einmal. Andere Benutzer können sich normalerweise weiterhin anmelden."

Die Anmeldung mit einem anderen Benutzer ist ebenfalls nicht möglich.
Wie komme ich jetzt an den Server um die Session zurückzusetzen?

Lösung:
Man kann von einem anderen Server/Client aus die Session per Kommandozeile ermitteln und zurücksetzen.
WICHTIG: SIE BENÖTIGEN EINEN BENUTZER, DER ADMINISTRATOR-RECHTE AUF DEM BETROFFENEN SERVER HAT!

1.) Melden Sie sich mit dem administrativen Benutzer an einem anderen Server/Client an

2.) Führen Sie den Befehl "query session /server:" aus, wobei Sie für den Namen des betroffenen Servers eintragen.

3.) In der Ausgabe sollten sie die betroffene Session sehen - merken Sie sich die entsprechende SESSION-ID

5.) Nun setzen Sie die betroffene RDP-Sitzung mit folgendem Befehl zurück: "reset session >SESSION-ID> /server:"
Wobei die Session-ID und der Servername mit den jeweiligen richtigen Werten ersetzt werden müssen.

6.) FERTIG - Die Session wird nun zurückgesetzt - das kann einige Minuten dauern!

Sollte der Fehler häufiger auf Server 2008R2 auftreten, dann gibt es von Microsoft einen Hotfix.
Hier scheint es ein Problem zu geben zwischen dem Prozess csrss.exe und manchen Anwendungen.
Microsoft: KB2661332 - Sie können keine Remotedesktopdienste-Sitzung auf einem Windows Server 2008 R2-basierten Server wiederherstellen.

Quelle:
rodolfovaraujo: How to kill RDP sessions remotely
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)