Spaß mit Zertifikaten am TV

Also drehen sie DVB-T ab. Klar, war ja zu einfach mit Kabel rein und gut ists. Klar steht bei LG dass das TV Gerät DVB-T/T2 kann. Klar steht viel weiter unten ganz klein „nicht alle Modelle“. Klar war unseres so eines welches nur T und kein T2 kann.

Also ein SAT CI+ Irdeto CAM mit ORF Zertifizierung gekauft (um den halben Preis den das ORF-Teil kostet) und reingestopft – was kommt?

Irdeto Access
CI+ Error Host Zertifikat ungültig
abgelaufen, bitten wählen sie den DTV-
Service -16

Nach kurzer Recherche erkannt dass der das wörtlich meint – also auf Kanal 16 (egal was dort programmiert ist) und er beginnt mit der Authentifizierung. Bleibt bei 3/5 hängen.

Weiter recherchiert – und diese Seite gefunden (offensichtlich arbeiten da eh _alle_ CAMs mit dem Chipsatz oder wie man das immer nennt was da drinsteckt) – und was lesen wir da?

Q: If the authentication failed just after step 3/5 or pop up message of “CI+ ERROR: Host Certificate Invalid-Expired, Please tune to DTV service – 16”, what can be done?

A: Please check whether the signal connection is OK, and check whether the TV time setting is the current time. If the TV has set to current time, that means the CI+ certification has something wrong, please contact TV service center.

Holy hell – die Zertifikatshölle ist auf die TV Geräte (und vermutlich Receiver) gekommen. Datum/Uhrzeit manuell eingestellt und siehe da…..zum Glück hat das Teil keine Internetanbindung sonst könnts auch noch die CRL checken wollen.

 

SharePoint Subdirectory einer Document Library kopieren

Da man mit Export-SPWeb bzw. Import-SPWeb bzw. im GUI über granular Backup/Restore nur ganze Document Libraries kopieren kann hab ich mich auf die Suche gemacht und bin hierauf gestoßen. Da das dort aufgeführte „Programm“ eher nicht so 1:1 zu verwenden war (und auch bei den Foldern beispielsweise Author/Timestamp nicht setzt) und ich die Geschichte mit Excel, Versionen und verschiedenen Modi etc. nicht benötigte habe ich es entsprechend umgeschrieben (mit Hilfe). Ohne wirklich Errorhandling und kaum Logging – aber es hat einwandfrei funktioniert (SharePoint ist offenbar relativ relaxed wenn man Dinge added die es schon gibt):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Microsoft.SharePoint;

namespace Gallauner
{
   class SharepointListCopy
   {
      static void Main(string[] args)
      {
         string sSourceSite = "https://oldsite.domain.com";
         string sSourceWebName = "SomeWeb";
         string sSourceListName = "SomeList";
         string sSourceFolderName = "SomePath/MorePath/LastPath";
         string sDestSiteName = "https://newsite.domain.com";
         string sDestWebName = "SomeNewWeb/SubWeb";
         string sDestListName = "SomeNewList";
         string sDestFolderName = "";
         SPSite oSourceSite;
         SPList oSourceList;
         SPWeb oSourceWeb;
         SPListItemCollection oFolders;
         Microsoft.SharePoint.Administration.SPWebApplication oWebApp;

         // open source site/web/list
         oSourceSite = new SPSite(sSourceSite);
         oWebApp = oSourceSite.WebApplication;
         oWebApp.FormDigestSettings.Enabled = false;

         if (sSourceWebName == "")
            oSourceWeb = oSourceSite.RootWeb;
         else
            oSourceWeb = oSourceSite.OpenWeb(sSourceWebName);

         oSourceList = oSourceWeb.Lists[sSourceListName];
         if (oSourceList != null)
         {
            // search source folder
            oFolders = oSourceList.Folders;
            foreach (SPListItem oFolder in oFolders)
            {
               if (oFolder.Folder.Url == sSourceFolderName)
               {
                  // copy folder 
                  CopyFilesAndSubFolders(oLog, oFolder.Folder, oSourceWeb, 
                     sDestSiteName, sDestWebName, sDestListName, sDestFolderName);
               }
            }
         }
         oWebApp.FormDigestSettings.Enabled = true;
      }

      private static void CopyFilesAndSubFolders(Logfile oLog, SPFolder oFolder,
                                                 SPWeb oSourceWeb,string sDestSiteName,
                                                 string sDestWebName,string sDestListName,
                                                 string sDestFolderName)
      {
         SPSite oDestSite;
         SPWeb oDestWeb;
         SPList oDestList;
         SPFolder oDestFolder, oNewDestFolder;
         SPFile oFileCopy;
         SPUser oUser;

         // open site/web/list
         oDestSite = new SPSite(sDestSiteName);
         if (sDestWebName == "")
            oDestWeb = oDestSite.RootWeb;
         else
            oDestWeb = oDestSite.OpenWeb(sDestWebName);
         oDestList = oDestWeb.Lists[sDestListName];

         // find folder
         oDestFolder = null;
         if (sDestFolderName == "")
            oDestFolder = oDestList.RootFolder;
         else
         {
            foreach (SPListItem oTmpFolder in oDestList.Folders)
            {
               if (oTmpFolder.Folder.Url == sDestFolderName)
               {
                  oDestFolder = oTmpFolder.Folder;
                  break;
               }
            }
         }
         if (oDestFolder == null)
         {
            Console.WriteLine($"Cannot find destination folder '{sDestFolderName}'");
            return;
         }

         // copy files
         foreach (SPFile oFile in oFolder.Files)
         {
            Console.WriteLine($"FILE       {oFile.Name}");
            try
            {
               // add modifying user to destination web
               oUser=oDestWeb.EnsureUser(
                      (string)oFile.Properties["vti_modifiedby"]
                     );
            }
            catch (Exception)
            {
               // add failed, use me as modifying user
               oUser = oDestWeb.CurrentUser;
            }


            oFileCopy = oDestFolder.Files.Add(
                            $"{oDestWeb.Url}/{oDestFolder.Url}/{oFile.Name}", 
                            oFile.OpenBinaryStream(), 
                            oFile.Properties, 
                            oUser, 
                            oUser, 
                            (DateTime)oFile.Properties["vti_timelastmodified"],
                            (DateTime)oFile.Properties["vti_timelastmodified"],
                            oFile.CheckInComment, 
                            true);
         }

         // copy folders
         foreach (SPFolder oSubFolder in oFolder.SubFolders)
         {
            Console.WriteLine($"FOLDER {oSubFolder.Url}");

            try
            {
               // add modifying user to destination web
               oUser = oDestWeb.EnsureUser(
                        (string)oSubFolder.Properties["vti_modifiedby"]
                      );
            }
            catch (Exception)
            {
               // add failed, use me as modifying user
               oUser = oDestWeb.CurrentUser;
            }

            // first create on destination list
            oNewDestFolder = oDestFolder.SubFolders.Add(oSubFolder.Name);

            // set author/editor and timestamps
            SPListItem oTmp = oDestList.GetItemByUniqueId(oNewDestFolder.UniqueId);
            oTmp["Author"] = oUser;
            oTmp["Editor"] = oUser;
            oTmp["Created"] = oSubFolder.Properties["vti_nexttolasttimemodified"];
            oTmp["Modified"] = oSubFolder.Properties["vti_nexttolasttimemodified"];
            oTmp.Update();

            // call ourself recursively
            CopyFilesAndSubFolders(oLog, oSubFolder, oSourceWeb, 
                                   sDestSiteName, sDestWebName, 
                                   sDestListName, oNewDestFolder.Url);
         }

         // cleanup objects
         oDestWeb.Dispose();
         oDestSite.Dispose();
      }
   }
}

Die Reference Assembly bekommt man über das Nuget Package „Microsoft.SharePoint“, laufen lassen kann man das Ding dann allerdings nur auf einem SharePoint Server – mit Remote Debugger lässts sich dann aber bequem testen/debuggen.

Acer Reparaturstatus mit Powershell auslesen

Weil ich gerade ein Gerät bei Acer zur Reparatur habe und nicht jedes mal auf der Website die Daten für die Statusabfrage eingeben wollte hab ich mal mit den F12 Tools des Browser geschaut was der da macht – und siehe da, die Daten kommen von einem REST-Service (https://customercare.acer-euro.com/customerselfservice/AjaxCall.aspx/GetCaseSearch, geht auch mit HTTP – die aufrufende Webseite nutzt das auch so….). Die Requestdaten kann man leicht aus den F12 Tools rauskopieren und Powershell kann seit Version 3.0 Invoke-RestMethod, das Ergebnis:

Invoke-RestMethod https://customercare.acer-euro.com/customerselfservice/AjaxCall.aspx/GetCaseSearch -Method Post -Body "{'RequestType': 'CaseId','RequestValue': 'meine Fallnummer','Zipcode': 'PLZ so wie beim Eröffnen eingegeben'}" -ContentType "application/json"|Select-Object -ExpandProperty d|ConvertFrom-Json|Format-Table SerialNumber,Status

Ergebnis in meinem Fall:
acerstatus

Linux: Trusted CA einfügen

Aus der Serie: Dinge die ich nicht nochmal suchen will: Wie füge ich auf Debian systemweit (für die Applikationen die sich daran halten) eine neue trusted Root CA hinzu:

  • CA Cert muss Base64 encoded vorliegen
  • Filename muss mit .crt enden und darf keine Leerzeichen (und vermutlich andere Sonderzeichen) enthalten, – und _ sind ok
  • File nach /usr/local/share/ca-certificates kopieren
  • sudo update-ca-certificates, gerne auch mit –fresh dann wird alles neu gebaut (Links in /etc/ssl/certs)
  • wenn alles richtig gelaufen ist sollte der Output „1 added“  oder sowas in der Art enthalten

Zertifikat am Office Web Apps Server tauschen

Geht ja voll easy mit Set-OfficeWebAppsFarm -certificateName .... (bei Wildcard Zert muss man halt Friendly Name vorher vergeben und den hier benutzen, kennt man eh schon) – nur sollte man vor dem Restart des Servers oder des Office Web Apps Services sicherstellen dass _ALLE_ CA Zertifikate des neuen Sitezertifikats in den _RICHTIGEN_ Stores des Rechners vorhanden sind, also nicht nur das Root CA Zert im Trusted Root CA Store sondern auch alle intermediate/issuing CA Zerts im Intermediate CA Store….die Fehlermeldungen im Log sind natürlich wie üblich völlig unbrauchbar 😀

Vielleicht auch hilfreich: Link

TiWorker und die CPUs

Stell dir mal vor du hast eine Maschine mit 48 logischen CPUs (2 Sockel zu je 12 Cores mit HT). Stell dir vor du installierst da 212 Updates drauf (frisch nach 2012 R2 U2 Installation). So sieht das dann aus:

TiWorker

Die Kiste läuft original auf 2-3% CPU Last. Ernsthaft.

 

SCOM Hyper-V Management Pack Extensions 2012 R2 Bugfix/Erweiterung

Die Hyper-V Management Pack Extensions 2012 R2 sind zwar an sich recht fein, haben aber ein paar Probleme:

  • Die Rule HyperVMPE2012R2.SRHV.LiveMigrationsFailures.Rule („Hyper-V MPE 2012 R2 Live Migrations Failures“) hat als Target alle Hyper-V 2012R2 Server, ist so ein Server aber kein Cluster Node gibts das EventLog Microsoft-Windows-Hyper-V-High-Availability-Admin und das HealthService wirft irgendwann eine netten Alert weil es nicht auf das EventLog zugreifen kann.

    Habe daher neue Klasse HyperVMPE2012R2.ClusterNodeRunningHyperV2012R2 („Hyper-V MPE 2012 R2 Cluster Node Running Hyper-V 2012 R2“) samt Discovery erzeugt und das Target der Regel dorthin verbogen.

  • Linux (ich hab hier nur Debian aber vermutlich ist es bei mehreren Distributionen (außer vermutlich RHEL wo man ja manuell installieren muss) so) meldet nicht die korrekte Version der LIS (Linux Integration Services) – bei mir ist es auch mit den brandneuesten Kernel/hyperv-daemons Package immer 3.1. Hyper-V meldet dann IntegrationServicesVersionState „Update required“ und der Monitor HyperVMPE2012R2.IntegrationServices.Monitor („Hyper-V MPE 2012 R2 Virtual Machine Integration Services Version“) wirft einen Alert.

    Habe daher sowohl Discovery als auch MonitorType auf dem der Monitor basiert so geändert dass Versionen 3.* und 4.* immer als up-to-date geliefert werden – mag zwar nicht immer stimmen aber besser als ein sinnloser Alert isses allemal 🙂

  • Ein paar Typos ausgebessert, vor allem Winodws auf Windows.
  • Ein paar fehlende DisplayStrings ergänzt.

 

Download: HyperVMPE2012R2

P.S.: Vielen Dank an Serge für den fantastischen MP Authoring Workshop, jetzt verstehe ich SCOM erst _richtig_ 😀

 

DoubleTake Reporting Services: Cannot connect to management service

DoubleTake Reporting Service 7.1.2.1445.2 – installiert auf einem „normalen“ Server, versucht gemäß Anleitung mit einer DoubleTake Console für die Konfiguration zu connecten und immer bei „Cannot connect to management service“ oder „Cannot connect to DoubleTake“ verendet. Call erzeugt und beim Versuch den wegzuschicken ein Fenster „halt, bevor wir das öffnen wirf doch mal Blick auf diese KBs“ bekommen und siehe da, diese Perle war dort versteckt: http://visionsolutions.custhelp.com/app/answers/preview_detail/a_id/47988, natürlich ist das sonst absolut unauffindbar….

Bei mir stand da allerdings schon keysize=2048 drin, der Tipp ganz unten mit .JKS File löschen und neu erzeugen (mit dem Batchding) hat allerdings dann geholfen; offenbar wird beim Setup zwar das korrekte .BAT File angelegt aber ein 512er Zertifikat erzeugt.

 

Unicode GREP mit der Kraftmuschel

Ich wollte auf die Schnelle wissen ob in einem Windows-EXE oder einer -DLL der Begriff „DebugLog“ vorkommt – da aber in vielen Programmen schon Unicode für Literalstrings Standard ist scheiterten alle Produkte die ich installiert hatte und auch die paar die ich probiert habe bzw. waren dermaßen krank zu bedienen dass sie schnell wieder deinstalliert/gelöscht waren.

Da SysInternals STRINGS auch Unicode kann hab ich mir kurzerhand einen PowerShell-Einzeiler gebastelt den ich mir hier fürs nächste Mal notiere 😀

$files=gci -recurse *.dll; $done=0; $files|% { $done++; $file=$_.FullName; write-progress $file -PercentComplete ($done/(($files.Count)/100)); strings $file|? { $_ -like "*DebugLog*" }|% { "$($file): $($_)" } }

Mein Fazit zu Container (Windows) und Nano Server

Kurz und knackig: Fürn Ar….

Langfassung:

  • Windows Server Container sind meiner Meinung nach nicht so schlank wie behauptet wird. Ich sehe den Gewinn nicht.
  • Windows Server Container sollen environmentagnostisch sein und sind damit nicht domainfähig, ist ok –  d.h. aber bis sich die Softwarelandschaft Containerisiert hat und jemand eine elegante Lösung für das Authentifizierungsproblem gefunden hat bleibt nicht viel übrig was da sinnvoll drin laufen kann. Und nein ich will jetzt nix über SAML, OAuth & Co. hören, das was ich mir da am einen Ende erspare müsste ich am anderen Ende investieren – ned sehr intelligent.
  • Nano Server ist nett als Tech-Demo (diese Bootzeit!!!!!) aber in einem „normalen“ Industrie/Gewerbe/Non-Extremhosterumfeld in etwa so sinnbefreit und beliebt wie der jetzt schon verfügbare Windows Server Core. Wenn dann alle Hardwarehersteller so in 5 bis 10 Jahren mitbekommen haben dass sie das auch sinnvoll supporten sollten machts im Hyper-V Umfeld sicher Sinn aber heute können das normale Unternehmen mit normaler Hardware nicht einsetzen.
  • Das gleiche gilt für Hyper-V Container – die sind für das normale Unternehmen völlig sinnbefreit, beim Superduperextremhoster machts u.U. Sinn.
  • Das Management der Container ist eine spaßbefreite Zone – ich weiß schon dass bei MS der neue Leitsatz „Command Line ist das neue GUI“ ausgegeben wurde aber wenn das nicht so wie früher ala „es gibt halt ein GUI, die richtigen Hardcoresachen gehen aber nur in der Powershell“ gelöst wird sondern in Command Line only (Powershell ist dabei nicht mehr DIE Command Line sondern nur noch EINE Command Line, wer hätte das gedacht) mündet finde ich das wenig lustig für die Leute die noch drölfzig andere Sachen machen (müssen).