BITS und Roaming

3 September 2019

Viele Programme wie Chrome oder Adobe Reader nutzen den Windows BITS-Dienst um darüber ihre Updates zu laden.

Wenn man nun aber auf einem Notebook aktiv ist und längere Zeit kein WLAN in Anspruch nimmt sondern ausschließlich per eingebautem LTE-Modem unterwegs ist dann werden die Updates nie geladen denn BITS meldet immer einen TransientError.

Die Sache stellt sich wie folgt dar:

PS > Get-BitsTransfer

JobId                                DisplayName                            TransferType JobState       OwnerAccount
—–                                ———–                            ———— ——–       ————
d110294d-b8cd-4980-8aea-5d0d132eb6ad {A6EADE66-0804-0000-1959-000000000000} Download     TransientError MEINRECHNER\Benutzer

Schaut man sich mehr Details an, dann wird man auch nicht unbedingt gleich schlauer:

PS > (Get-BitsTransfer)[0]|fl *

JobId                   : d110294d-b8cd-4980-8aea-5d0d132eb6ad
DisplayName             : {A6EADE66-0804-0000-1959-000000000000}
Description             :
HttpMethod              : GET
TransferType            : Download
JobState                : TransientError
TransferPolicy          : NoSurcharge
OwnerAccount            : MIKEL480\admin
Priority                : High
RetryInterval           : 300
RetryTimeout            : 7200
TransientErrorCount     : 0
ProxyUsage              : SystemDefault
ErrorContext            : GeneralQueueManager
ErrorCondition          :
InternalErrorCode       : -2145386407
ErrorDescription        : Die Einstellungen der Kostenübernahmerichtlinie des Auftrags bewirken, dass der Auftrag
                          derzeit nicht übertragen werden kann.

ErrorContextDescription : Fehler im BITS-Warteschlangen-Manager.

BytesTotal              : 18446744073709551615
BytesTransferred        : 0
FilesTotal              : 1
FilesTransferred        : 0
CreationTime            : 03.09.2019 10:45:45
ModificationTime        : 03.09.2019 10:45:45
TransferCompletionTime  : 01.01.0001 00:00:00
FileList                : {https://armmf.adobe.com/arm-manifests/win/ArmManifest3.msi}
ProxyList               :
ProxyBypassList         :

Da könnte man lang warten, denn der TransientError löst sich, wie gesagt, erst bei der nächsten LAN oder WLAN-Verbindung auf.

Die Fehlerbeschreibung, “Die Einstellungen der Kostenübernahmerichtlinie des Auftrags bewirken, dass der Auftrag derzeit nicht übertragen werden kann.”, gibt dann doch noch einen Hinweis, dass man es mit einem Kostenproblem, wegen z. B. Roaming zu tun hat.

Hat man nun aber auf dem Handy zum Beispiel eine Tagesflat aktiv, so möchte man diesen Umstand für die Updates ausnutzen. Man kann diesen Zustand ändern, wenn man dies dem BITS-Job mitteilt.

Mit ADMIN-Rechten fügt man der JobID einfach eine TransferPolicy Roaming hinzu und schon beginnt der Download:

PS > $JobId=( Get-BitsTransfer)[0].jobid
PS > Get-BitsTransfer -JobId $JobId| Set-BitsTransfer -TransferPolicy Roaming
PS > Get-BitsTransfer -JobId $JobId

Werbeanzeigen

InnoSetup analysieren bzw. auseinandernehmen

8 August 2019

Viele Installationsprogramme sind mit Hilfe von InnoSetup (http://www.jrsoftware.org/) erstellt. Gerade hatte ich das Problem, dass ein Installationsprogramm Schwierigkeiten machte und aufgrund eines schwächelnden Internetdienstes eine Installation nicht möglich war. Um der Sache auf die Spur zu kommen, musste zunächst die Installations-EXE-Datei mittels Innounp (https://sourceforge.net/projects/innounp/) was für Inno-Unpacker steht, entpackt werden.

..\innounp.exe -x -m ..\ProblemSetup.exe

Es werden automatisch Unterverzeichnisse mit den im Setup-Programm enthaltenen Dateien angelegt. Die Verzeichnis-Struktur sieht z. B. so aus:

embedded
{code_Get_InstPath}
{localappdata}
{tmp}
{win}

Dabei enthält das Verzeichnis embedded die Datei CompiledCode.bin welche ein mit RemObject Pascal Script Engine erstellte Datei ist (https://www.remobjects.com/ps.aspx). Möchte man nun verstehen, was in CompiledCode.bin abgeht, kann einem ein kleiner Pascal Script Disassembler mit Namen IFPSTools helfen: https://github.com/Wack0/IFPSTools, er benötigt aber eine PHP-Runtime wie z. B. https://windows.php.net/download#php-7.3. Danach kann man einfach z. B.

.\php.exe .\DisIFPS.php ‚..\embedded\CompiledCode.bin‘ .\diss.txt

aufrufen und man erhält in diss.txt den Code von CompiledCode.bin. Der Code ist zwar etwas gewöhnungsbedürftig zu lesen aber die Struktur und Vorgehensweise kann doch daraus gelesen werden. Wer Pascalscript besser verstehen will, der sollte sich dies hier durchschauen: https://github.com/remobjects/pascalscript.

Eine Alternative zu InnoUnp sei noch genannt: http://constexpr.org/innoextract. Diese Version läuft unter Linux.

Speicherinfos mittels Powershell unter Windows ermitteln

31 Juli 2019

Um schnell einen Überblick über die Arbeitsspeichersituation eines Rechners zu bekommen helfen diese WMI-Informationen:

$Slots=Get-CimInstance -ClassName Win32_PhysicalMemoryArray
$RAM=Get-CimInstance -ClassName Win32_PhysicalMemory
$slots | % {"DIMM Slots: $($_.MemoryDevices)"}
$ram | % {"Memory installed: $($_.DeviceLocator)"; "Memory Size $($_.Capacity/1GB)"}

und gibt dann

DIMM Slots: 2
Memory installed: ChannelA-DIMM0
Memory Size 16
Memory installed: ChannelB-DIMM0
Memory Size 16

aus.

Wenn man erfahren möchte, wie viel Speicher davon benutzt wird, kann man diese Zeilen verwenden:

Get-CimInstance win32_operatingsystem | select @{N="Frei GB";E={$_.FreePhysicalMemory/1MB}}, @{N="Gesamt GB";E={$_.TotalVisibleMemorySize/1MB }}, @{N="Anteil frei in Prozent";E={$_.FreePhysicalMemory*100 / $_.TotalVisibleMemorySize}}

ergibt z. B.:

Frei GB                : 16,7665214538574
Gesamt GB              : 31,8850631713867
Anteil frei in Prozent : 52,5842503862545

Windows Admin Center SSL-Zertifikat erneuern

14 Juli 2019

Wenn man das Windows-Admin-Center auf einem Windows-Server Rechner installiert, wird ein spezieller Gateway-Dienst installiert. Für diesen Dienst kann automatisch ein SSL-Zertifikat erstellt werden. Dies läuft allerdings nur 60-Tage. Danach muss es erneuert werden. Eine Möglichkeit dabei ist, einfach bei den installierten Programmen das Windows-Admin-Center De-Installationsprogramm aufzurufen und dann den Punkt Ändern auswählen. Nun bekommt man nochmal die Möglichkeit ein neues Zertifikat zu erstellen. Diese Methode klappt allerdings nur, wenn man zuvor das alte Zertifikat entfernt hat.

Gehen wir vom Port 8081 für das Windows-Admin-Center aus. Dann kann man mittels Admin-Commandline folgendes abrufen:

PS > netsh http show sslcert

SSL-Zertifikatbindungen:
————————-

    IP:Port                      : 0.0.0.0:8081
    Zertifikathash              : 5104877e8eae1698fea7f3445b5eb0d728e02b95
    Anwendungs-ID               : {3fbbd223-54fa-4cb6-9c95-47eebdf667f8}
    Zertifikatspeichername       : (null)
    Clientzertifikatsperre überprüfen : Enabled
    Zur Sperrüberprüfung ausschließlich zwischengespeichertes Clientzertifikat verwenden : Disabled
    Verwendungsüberprüfung                  : Enabled
    Sperraktualisierungszeit    : 0
    Zeitlimit für URL-Abruf        : 0
    Steuerelement-ID               : (null)
    Steuerelement-Speichername               : (null)
    DS-Zuordnungsverwendung              : Disabled
    Clientzertifikat aushandeln : Disabled
    Verbindungen ablehnen           : Disabled
    HTTP2 deaktivieren                : Not Set

Um das Zertifikat zu entfernen ruft man

PS C:\Users\Administrator> netsh http delete sslcert ipport=0.0.0.0:8081

Das SSL-Zertifikat wurde erfolgreich gelöscht.

auf. Nun kann man wie oben beschrieben das neue Zertifikat erstellen lassen.

Um zu prüfen, ob das neue Zertifikat wirklich das aktuelle ist, kann man z. B. so weitere Daten zum Zertifikat ermitteln, dazu wird der Zertifikatshash benötigt – der in unserem Beispiel 5104877e8eae1698fea7f3445b5eb0d728e02b95 lautet – und mittels Powershell so ausgelesen werden kann:

PS > $cert=dir cert:\ -Recurse | where thumbprint -match 5104877e8eae1698fea7f3445b5eb0d728e02b95
PS > $cert[0]|fl *

Dabei werden mehrere Zertifikate, welche aber alle das gleiche darstellen zurückgegeben, deshalb werden nur die Daten des ersten Zertifikats zurückgegeben.

Eigentlich sollte es auch möglich sein alles per Commandline zu steuern, aber meine bisherigen Versuche waren nicht von Erfolg gekrönt. Zu diesem Thema ein wichtiger Link: https://www.der-windows-papst.de/2018/06/25/windows-admin-center-honolulu-installieren/. Auch sollte dabei das Windows-Admin-Center Gateway wahrscheinlich neu gestartet werden: Restart-Service ServerManagementGateway. Half trotzdem bisher noch nichts.

Windows 10 Grafikdarstellung Reset

6 Juli 2019

Bei ziemlich viel, gleichzeitig geöffneten Fenstern unter Windows 10 kann es schon mal vorkommen, dass die Darstellung leidet und bestimmte Ressourcen ausgehen, so dass die benutzten Programme abstürzen. Manchmal bleibt dann am Bildschirm der Schatten der zuletzt geöffneten Fenster stehen.

Mit der Tastenkombination STRG+Shift+Win+B kann man einen Grafikkartentreiber-Reset durchführen. Der Bildschirm wird dann kurz schwarz und meldet sich dann wieder zurück. Wenn die Darstellung dann immer noch nicht korrekt sein sollte, muss noch der Windows Desktop Manager gestoppt werden. Dazu geht man einfach in den Taskmanager und killt DWM.EXE. Geht auch per Commandline. Falls es nicht klappt, hilft der Prozessexplorer von Sysinternals.

D3DCompiler_43.dll oder ähnliche Datei fehlt Fehlermeldung unter Windows 10 bei 3D-Anwendungen

25 Juni 2019

Bei einigen 3D-Anwendungen wird die Datei D3DCompiler_43.dll benötigt um 3D-Objekte für die Darstellung oder Berechnung umzurechnen. Genauer gesagt, die Datei ist der “Direct3D HLSL Compiler”. Leider gibt es einige Programme, welche die erforderlichen DirectX-Dateien nicht in ihrer Distribution enthalten. Eigentlich ist es die Aufgabe des Betriebssystem oder des passenden .Net Frameworks dafür zu sorgen. Fakt ist aber, dass in diesem Bezug viel Chaos herrscht.

Das Problem äußert sich beim starten betreffender Anwendungen z. B. über diese Fehlermeldung:

Error: DLL D3DCompiler_43.dll Das angegebene Modul wurde nicht gefunden Ausnahme von HResult0x8007007E

Das Problem lässt sich lösen (sogar auf einem aktuellen Windows 10 1903), wenn man die Datei aus diesem Link herunterladet und startet: https://www.microsoft.com/de-DE/download/details.aspx?id=35. Dadurch wird der “DirectX-Endbenutzer-Runtimes Web Installer” gestartet, welche die fehlenden Dateien nachrüstet.

Diese Methode sorgt dafür, dass im SYSTEM32-Verzeichnis einige D3DCompiler-Dateien hinzugefügt werden:

D3DCompiler_33.dll
D3DCompiler_34.dll
D3DCompiler_35.dll
D3DCompiler_36.dll
D3DCompiler_37.dll
D3DCompiler_38.dll
D3DCompiler_39.dll
D3DCompiler_40.dll
D3DCompiler_41.dll
D3DCompiler_42.dll
D3DCompiler_43.dll
D3DCompiler_47.dll

Windows 10 hat von Haus aus eigentlich nur die D3DCompiler_47.dll an Bord.

Hier noch eine Variante wo .Net Framework-Updates geblockt werden, betrifft allerdings nur Versionen vor Windows 10: https://support.microsoft.com/de-de/help/4020302/the-net-framework-4-7-installation-is-blocked-on-windows-7-windows-ser

Qnap virtuelle Rechner per Terminal mittels virtsh verwalten

22 Juni 2019

Bei QNAP NAS-Modellen mit einem Intel Prozessor kann man virtuelle Maschinen direkt auf dem NAS mittels KVM einrichten. Die Oberfläche der Virtualization Station ist schön aufgeräumt und einfach gehalten. Aber aus genau diesem Grund findet man nicht alle Punkte, die man eigentlich so braucht.

In der aktuellen QTS 4.4.1 Version ist libvirt 1.2.19 mit Hypervisor QEMU 2.3.1 enthalten. Die Frage ist aber wie kommt man an diese Informationen? Am einfachsten man meldet sich mittels SSH am NAS an und geht mittels Busybox und dem Befehl virsh auf die Suche. Virsh ist ein mächtiges Kommandozeilen-Tool bzw. Shell zur Verwaltung von virtuellen Maschinen. Blöd nur, dass auf anhieb virsh nicht aufrufbar ist. Man muss zunächst zwei Umgebungsvariablen definieren:

export LD_LIBRARY_PATH=/QVS/usr/lib:/QVS/usr/lib64/
export PATH=$PATH:/QVS/usr/bin/:/QVS/usr/sbin/

Danach steht virsh direkt zum Aufrufen bereit, z. B. so:

virsh version

Einfachste Methode einen virtuellen Mac hochzuziehen

15 Juni 2019

Benötigt wird ein aktueller Intel-Rechner, z. B. ein Intel NUC, darauf installiert man ein aktuelles Debian, in diesem nutzt man dann QEMU um einen virtuellen Mac hochzuziehen.

Dazu benötigt man die Skripte von https://github.com/foxlet/macOS-Simple-KVM. Es werden alle nötigen Downloads direkt über Apples Wiederherstellungskonsole durchgeführt. Ein Tutorial beschreibt wie man das ganze einrichtet: https://passthroughpo.st/new-and-improved-mac-os-tutorial-part-1-the-basics/ und wie man Verfeinerungen in Bezug auf Netzwerk, Grafikkarte und Sound vornehmen kann: https://passthroughpo.st/mac-os-vm-guide-part-2-gpu-passthrough-and-tweaks/.

Automatisch Bilder von Webseiten erstellen

1 Juni 2019

Manchmal kann es ganz nützlich sein, eine Webseite direkt als Bild speichern zu können. Chrome (ab Version 59 bzw. 60) bringt von Haus aus eine Möglichkeit mit, dies per Eingabeaufforderung zu machen.

Start chrome.exe –headless –screenshot="C:\temp\bild.png" https://www.bild.de –window-size=1024,1280

hier die passende Ausführung in Powershell:

Start-Process  chrome.exe -ArgumentList  "–headless", ‚–screenshot="C:\temp\bild.png"‘, "https://www.bild.de", "–window-size=1024,1280"

Beide Varianten führen dazu, dass im Verzeichnis C:\Temp die das Bild der Webseite in der Datei bild.png gespeichert wird.

Wer die Seite lieber als PDF-Datei speichern möchte, der verwendet diese Variante:

Start chrome.exe –headless –print-to-pdf="c:\temp\bild.pdf" https://www.bild.de –window-size=1024,1280

in Powershell also:

Start-Process  chrome.exe -ArgumentList  "–headless", ‚–print-to-pdf="c:\temp\bild.pdf"‘, "https://www.bild.de", "–window-size=1024,1280"

Weitere Infos zum Headless-Modus findet man hier: https://developers.google.com/web/updates/2017/04/headless-chrome.

COM-Schnittstelle bei Windows Remote Desktop oder Virtuellen Maschinen

24 Mai 2019

Wer eine physische COM-Schnittstelle auf einem anderen Rechner mittels Remote-Desktop verfügbar machen möchte, muss folgendes beachten.

Zuerst muss man im Remote Desktop die Optionen einblenden, um beim Register Lokale Ressourcen, unten bei “Lokale Geräte und Ressourcen”, die Weiter-Schaltfläche anklicken zu können. Dort aktiviert man nun den Eintrag Ports.
Alternativ kann man auch in der betreffenden RDP-Datei den Eintrag redirectcomports:i:0 auf 1 setzen und speichern.

Wer nun die Verbindung zum Remoterechner herstellt wird vielleicht gleich im Geräte-Manager nachschauen, ob die COM-Schnittstelle unter “Anschlüsse (COM & LPT)” auch auftaucht. Doch da herrscht gähnende Leere. Tja, der Geräte-Manager ignoriert den COM-Port großzügig.

Der Port ist aber trotzdem verfügbar und kann mittels Powershell-Eingabeaufforderung mit diesem Befehl aufgelistet werden:

[System.IO.Ports.SerialPort]::GetPortNames()

Gemeldet wird dann z. B. COM1.

Wenn man bei virtuellen Maschinen mehr machen möchte, muss man Named Pipes benutzen und kann so RS232-Hardware vom Host direkt einer virtuellen Maschine zur Verfügung stellen. Realisiert wird dies durch PipeToCOM: https://github.com/mcmlxxix/PipeToCom. Diese Lösung hat natürlich den Vorteil ohne Remote Verbindung auszukommen. Jetzt wird es aber wieder kompliziert, denn wenn man eine Generation 2 VM in einem Hyper-V hat, dann gibt es keine COM-Ports mehr. Man kann allerdings mittels Powershell und SET-VMComPort COM1 aktivieren und darüber den Pfad für die Pipe setzen.