­

AD CA Restore und der Fehler 0x8007010b

Es gibt ja jede Menge KB-Artikel und Diskussionen zum Thema 0x8007010b beim Restore einer CA – in meinem Fall kam der generische Fehler mit der Zusatzinfo “The expected data does not exist in this directory. Please choose a different directory.” – obwohl genau die Files in dem gewählten Directory lagen die u.a. in KB298138 beschrieben sind.

Was dort (und auch sonstwo) aber niiicht steht ist dass in dem Directory SONST NICHTS LIEGEN DARF – wie etwa (wie in meinem Fall) EDB####.log Files von anderen Backups als dem aktuellen (meine Sicherung hat jeden Tag ins gleiche Verzeichnis geschrieben und immer neue .log Files erzeugt)…..

Mehr Spaß mit AD RMS

Szenario: Firma mit AD RMS (auch über Internet erreichbar) will geschütztes XPS an Mitarbeiter einer anderen Firma ohne Federation schicken (der Mitarbeiter der anderen Firma hat aber z.B. einen Account in der sendenden Firma).

Ergebnis: Geht nicht. XPS Viewer kann per Default den Benutzer nicht im AD RMS der sendenden Firma aktivieren, er versuchts nicht mal.

Workaround 1: Mit Office 2010 (nicht 2013, das verwendet MSIPC den neuen RMS Client!) ein geschütztes Dokument (Mail, Word, Excel) öffnen – die können mit dem Szenario umgehen, fragen nach einem Account in der sendenden Firma und aktivieren den Account. XPS Viewer kann dann auf die Informationen aufbauen und geschützte XPS anzeigen.

Workaround 2: Folgende Registrykeys erzeugen (alle REG_SZ):
* HKEY_LOCAL_MACHINE\Software\Microsoft\MSDRM\ServiceLocation\Activation, Default Value = https://rms.meinefirma.com/_wmcs/licensing
* HKEY_LOCAL_MACHINE\Software\Microsoft\MSDRM\ServiceLocation\ServiceLocation, Default Value = https://rms.meinefirma.com/_wmcs/certification
* HKCUS\oftware\Microsoft\XPSViewer\Common\DRM\CorpCertificationServer = https://rms.meinefirma.com/_wmcs/certification
* HKCU\Software\Microsoft\XPSViewer\Common\DRM\CorpLicenseServer = https://rms.meinefirma.com/_wmcs/licensing
* HKCU\Software\Microsoft\XPSViewer\Common\DRM\Username = user@meinefirma.com
* HKCU\Software\Microsoft\XPSViewer\Common\DRM\UserType = WindowsAuthProvider

Vorsicht: Das alles ist (vermutlich) in keinster Weise supported oder dokumentiert und natürlich ohne Gewähr 🙂

Spaß mit AD RMS

“Cryptographic Mode 2” – wird beim Setup der AD RMS (Active Directory Rights Management Services) Rolle als “alle neue Installationen sollten das haben” beschrieben, ohne auf die dezenten Nebenwirkungen hinzuweisen:

“Downlevel” Clients (wie Windows 7, ja, wirklich) – können das nicht. Exceptions in der Art "The given certificate does not contain an acceptable combination of asymmetric key and signature hash algorithms. (Microsoft.DigitalRightsManagement.Cryptography.UnsupportedCryptographicSetException)" bei der Aktivierung eines Accounts. Hier gibts einen Hotfix.

Exchange 2010 kann nicht damit umgehen. Hier ist SP3 notwendig.

Office 2010 kann nicht damit umgehen. Hier gibt es zwar einen Hotfix aber mittlerweile ist SP2 vermutlich die bessere Wahl (für Office 2007 gilt ähnliches).

UND

wie ich eben im Rahmen eines Calls dazu lernen musste gibts 2 RMS Clients / SDKs: MSDRM (alt, komplex, Templates warden nicht vollelektrisch geladen/aktualisiert) und MSIPC (neu, einfacher, Templates werden ohne weitere Konfiguration erkannt und geladen) – coolerweise ist bisher aber Office 2013 (und vermutlich SharePoint 2013) das einzige Produkt dass MSIPC verwendet, d.h. selbst der XPS Viewer in Windows 8.1 verwendet nach wie vor den alten Client und man muss die Templateverteilung sichern.

…und hier noch die Anleitung wie man einen MSIPC Client dazu bringt sofort die neuen Templates zu holen: Office 2013, AD RMS Client 2.x and Template distribution

Primary/Secondary Status AlwaysOn Group/DB

Da es offenbar keine eingebaute Funktionalität gibt mit der man auf einem SQL 2012 Server mit AlwaysOn Availability Groups feststellen kann ob eine Gruppe oder eine DB am aktuellen Server gerade die Primary oder die Secondary Copy hält (was u.a. für Jobs eher wichtig ist weil es ja eher keinen weniger Sinn macht auf der read-only secondary copy herum zu werkeln) habe ich ein wenig recherchiert und folgende zwei custom scalar valued functions sind unten raus gefallen:

CREATE FUNCTION [dbo].[fn_is_availability_database_primary] ( @AVAILABILITYDATABASENAME VARCHAR(255) )
RETURNS BIT
AS
BEGIN
DECLARE @RESULT BIT

IF (select count(*) from sys.availability_databases_cluster 
    where group_id in 
    (select group_id from sys.dm_hadr_availability_group_states 
      where primary_replica=@@SERVERNAME) 
      and database_name=@AVAILABILITYDATABASENAME) = 1
   SET @RESULT=1;
ELSE
   SET @RESULT=0;

RETURN @RESULT;
END

CREATE FUNCTION [dbo].[fn_is_availability_group_primary] ( @AVAILABILITYGROUPNAME VARCHAR(255) )
RETURNS BIT
AS
BEGIN
DECLARE @RESULT BIT;
    IF (select count(*) from sys.dm_hadr_availability_group_states 
        where group_id=(select group_id from sys.availability_groups 
        where name = @AVAILABILITYGROUPNAME) and primary_replica=@@SERVERNAME) = 1
   SET @RESULT=1;
ELSE
   SET @RESULT=0;

RETURN @RESULT;
END

Aufgerufen mit z.B.

IF master.dbo.fn_is_availability_database_primary(DB_NAME())=0
BEGIN
PRINT 'server not primary for availability database, aborting'
RETURN
END

kann man verhindern dass der Job auf der secondary copy failed.

RDSH Shadowing in Windows Server 2012R2

Nach dem großen Aufschrei als Microsoft das Session Shadowing im Windows Server 2012 RDSH komplett entfernt hat (angeblich wegen Problemen mit dem Modern UI, als Ersatz wurde Offered Remote Assistance (msra /offerra) angeboten) haben sie sich (halb) besonnen und in 2012 R2 doch wieder ein Shadowing eingefügt. Halb deswegen weil man einerseits dafür ein komplettes RDS-Deployment (mit Web Access, Broker (inkl. SQL) und dem anderen Klimbim (Collections, etc.)) braucht damit mans im Server Manager nutzen kann sondern andererseits auch weil sie nach wie vor keine adequaten Ersatztools für tsconfig.msc, tsadmin.msc, etc. gebracht haben – der durchschnittliche Supportler an der Hotline ist sicher überglücklich wenn er/sie den Server Manager bedienen darf…..
Zum Gluck gibts Process Monitor/Process Explorer mit dem man rausfinden kann was da im Hintergrund abgeht. In Wahrheit wird nämlich nur ein MSTSC mit folgenden neuen Parametern gestartet (sind auch via MSTSC /? dokumentiert):

/shadow:<session-id>    (zu spiegelnde Session)
/control      (weglassen wenn man nur viewen will)
/v:<servername>       (wenn man remote spiegeln will)
/noConsentPrompt         (wenn man Bestätigung vom Zielbenutzer nicht einholen will)

Inwieweit diese Dinge über GPO enforcebar sind (z.B. ist noConsentPrompt schon stark) weiß ich (noch) nicht….

Hyper-V und/oder Cluster Shared Volumes und der Antivirus

….kurz zusammen gefasst: Keine gute Kombination. Unbedingt diesen Artikel beachten. ESET scheitert vollständig (entweder friert der Host ein oder Live Migrations scheitern, passende Ausnahmen funktionieren einfach nicht bzw. sind gar nicht möglich), Avira braucht alle in dem Artikel genannte Ausnahmen – C:ClusterStorage damit Live Migrations funktionieren und VMMS.EXE bzw. VMWP.EXE damit man keine Out Of Memory Exception bekommt wenn man sich die Settings ein VM ansehen will 😮    Die diversen Foren der anonymen Hyper-V Administratoren sind voll mit den lustigsten Problemen – MS empfiehlt nicht umsonst Server Core mit quasi null offenen Ports auf Hyper-V Hosts, aber so viel Mut kann man glaub ich nicht kaufen dann ohne Antivirus zu fahren 🙂

TSADMIN das zittern und zuckeln austreiben

TSADMIN.MSC (genial als Remotedesktopdienste-Manager eingedeutscht) hat ein Problem – es ist nicht für Farmen mit zig Servern und tausenden Sessions gemacht. Spätestens bei 600-800 Sessions und einer entsprechenden Logon/Logoffrate ist das Ding unbenutzbar weil die Sessions über WTSWaitSystemEvent live in die Liste eingearbeitet werden – und das kann nicht abgestellt werden (konfigurierbar ist nur Prozessupdatefrequenz).

Glücklicherweise ist das MMC SnapIn in .NET implementiert und nicht obfuscated, d.h. man kann das Ding (%windir%\System32\tsadmin.dll) ganz gut mit z.B. ILSpy disassemblieren und als Visual Studio Projekt speichern.

ILSpy macht im Projekt dann pro Namespace einen Folder, in Microsoft.TerminalServices.Monitor.SnapIn gibt’s eine Klasse TerminalServer.cs – dort finden sich die Methoden die für die Updaterei zuständig sind: StartSessionMonitoring und EndSessionMonitoring. Ich habe einfach als erste Zeile ein return; eingefügt und schon ist Schluß mit zittern und zuckeln.

Um das ganze kompilieren zu können muss man bei ein paar Events noch die add und remove Methoden auskommentieren, weiß nicht warum das Fehler wirft – hat aber auskommentiert bisher keine erkennbaren Folgen. Ein paar Namespaces werden noch nicht von ILSpy eingefügt bzw. sind mehrdeutig (System.Threading.Monitor vor allem) – aber das ist eh täglich Brot für einen .NET Entwickler 🙂

Die DLL die da rauskommt legt man dann auf einem beliebigen Client (ab XP vermutlich, Windows 7 sicher) in ein beliebiges Verzeichnis – zusammen mit WTS.DLL, CERTPICK.DLL und TSADMIN.MSC (von einem RDS-Host oder wenn am Client RSAT installiert ist aus %windir%System32). Damit das SnapIn im neuen Verzeichnis gesucht wird muss man noch unter HKLM\SOFTWARE\Microsoft\MMC\SnapIns in den Keys FX:{3FCE72B6-A31B-43ac-ADDA-120E1E56EB0F} und FX:{321f5192-3295-46ba-9bf1-7a18d8c31322} die Werte ApplicationBase auf das Verzeichnis in dem das neue tsadmin.dll liegt und den Wert Type so ändern dass  PublicKeyToken nicht mehr enthalten ist (hinter Culture=neutral einfach abschneiden) ändern.

TSADMIN.MSC sollte so beim nächsten Start die neue DLL laden und die Sessions nicht mehr laufend aktualisieren. Ich hab für mich dann noch folgende Dinge eingefügt aber das würde hier zu weit gehen:

  • Spalten werden nach Ermittlung der Daten automatisch auf eine passende Breite gebracht damit alles sichtbar ist
  • Filter auf Benutzer, Clients, Server und Prozessnamen
  • Anzeige Anzahl der Listenitems in der Beschreibungsleiste
  • verhindern dass beim Start alle Sessions aller konfigurierten Gruppen ausgelesen werden (sondern erst bei Klick auf eine Gruppe)

Die notwendigen Änderungen dazu spielen sich alle in den Klassen GroupNode, ServerNode und TSManagerForm ab wenn jemand Lust verspürt – und ja, natürlich ist das gänzlich unsupported und böse 😮

2008R2 Bug des Monats

Noch früh im Monat aber was Besseres kommt nicht mehr: Wieder mal ein Grund ein oder zwei Jahre zu warten bevor man eine Windows-Version produktiv einsetzt: Audio capture redirection feature does not work after a second remote desktop connection is created in Windows Server 2008 R2. Rätselhaft wie sowas durch alle Alpha-, Beta-, TAP- und Sonstwas-Programme schlüpfen konnte 😐

Und ja, mit Citrix wär das auch passiert: Bi-Directional Audio Recordings Stop Working when Another Session is Opened or Closed

RemoteApps ohne RDPINIT.EXE am Client

…..funktioneren nicht 😀   Windows 7 Embedded Standard startet RDPINIT.EXE defaultmäßig nicht (warum weiß wohl nur Microsoft) – und damit zeigen RemoteApps ein “interessantes” Verhalten: Starten, anmelden und dann passiert exakt gar nix (für 2-3 Minuten), anschließend schreibt der Terminalserver einen DWM-Event (Fehler 0x40010004, irgendwas mit Desktop composition) und meldet die Session ab. Startet man RDPINIT.EXE vor der RemoteApp läuft alles rund – offensichtlich kommunizieren der RDPINIT-Prozess in der Session mit dem auf dem Client. Startet man dann lokal auch noch RDPCLIP.EXE funktioniert auch das Clipboard Mapping 😮

 

Barcode Scanner, Windows Embedded 7 und die Großbuchstaben

Ausgangslage:

  • HP t510 Thin Client mit Windows Embedded Standard 7 SP1
  • Barcode Scanner Symbol LS2208 USB
  • Terminalserververbindung mit RDP auf Windows Server 2008 R2 SP1

 

Problem:

  • Barcode Scans sollen auf Großbuchstaben konvertiert werden, tun sie aber nicht immer
    (einzelne Zeichen sind klein bzw. fehlt bei Sonderzeichen das Shift)

 

vermutliche Ursache:

  • scheinbar ein Timingproblem, sieht so aus als ob die verschiedenen (simulierten) Tastendrücke für SHIFT und den Buchstaben nicht am Terminalserver ankommen (zumindestens nicht zusammen) – auf einem “normalen” Windows 7 SP1 Rechner (mit entsprechend Dampf auf der CPU) passierts nämlich nicht

 

Workaround:

  • im RDP Client die Kombotasten von “nur wenn in Vollbildschirmmodus” (oder so ähnlich) auf “am Client” umstellen
  • damit geht’s zwar Barcode scannen einwandfrei dafür wird z.B. Strg+Alt+Entf oder Alt-Tab nicht in der Session sondern lokal angewendet was keinen wirklich Sinn macht – braucht man diese oder ähnliche Tastenkombinationen nicht ist das Problem damit gelöst

 

Lösung:

  • RDP8 für Windows 7 installieren
  • zuerst KB2574819 (DTLS, Voraussetzung für den RDP8 Client, Reboot muss nicht ausgeführt werden)
  • dann KB2592687
  • Rebooten, gut ists, Barcodes sind so wie sie sein sollen