Veeam Backup & Replication Console startet nicht (veeam.backup.shell.exe System.Xml.XmlException)

Problem

Die Veeam Backup & Replication Console startet „auf einmal“ nicht mehr. Gestern ging es noch, heute passiert (scheinbar) nichts mehr, es ist nicht einmal der Anmeldedialog zu sehen. Im Ereignisprotokoll sind nach jedem Versuch veeam.backup.shell.exe zu starten diese Fehler zu sehen:

  • Protokoll: Anwendung
  • Quelle: .NET Runtime
  • Ereignis-ID: 1026
Anwendung: veeam.backup.shell.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: System.Xml.XmlException
bei System.Xml.XmlTextReaderImpl.Throw(System.Exception)
bei System.Xml.XmlTextReaderImpl.ParseText(Int32 ByRef, Int32 ByRef, Int32 ByRef)
bei System.Xml.XmlTextReaderImpl.ParseText()
bei System.Xml.XmlTextReaderImpl.ParseElementContent()

[...]

Lösung

Warscheinlich ist nur die Benutzerkonfiguration der Konsole kaputt. Das .NET Framework ist (ausnahmsweise) da mal nicht schuld.

Es hilft das Löschen der Datei:

%USERPROFILE%\AppData\Local\Veeam_Software_Group_GmbH\veeam.backup.shell.exe_Url_hu1utqnj52thvmhrg5kie2bl15o22i22\10.0.0.0\user.config

Danach startet die Konsole sofort wieder.

TEMP-Verzeichnisse aller Benutzer (und Windows) auf einmal aufräumen

Problem

Terminalserver, oder mit der modernen Bezeichnung „RemoteDesktop Sessionhosts“, neigen trotz aller Pflege dazu nach und nach „Voll zu müllen“.

Vor allem die verschiedenen TEMP-Verzeichnisse sammeln im Laufe der Zeit (meist) unnötige Daten an. Zu den „üblichen Verdächtigen“ wie %WINDIR%\Temp und %Windows%\Prefetch gesellen sich vor allem die Benutzer-Verzeichnisse Appdata\Local\Temp\.

Lösung

Mit der PowerShell kann dieses Problem in zwei Zeilen (und einem regelmäßigen Start mit enstsprechenden Rechten) gelöst werden:

$tempfolders = @("C:\Windows\Temp\*", "C:\Windows\Prefetch\*", "C:\Users\*\Appdata\Local\Temp\*" )

Remove-Item $tempfolders -force -recurse

Die erste Zeile enthält in einem Array die entsprehenden Ordner (PS versteht auch Platzhalter wie ‚*‘), die zweite Zeile den Befehl der dafür ausgeführt wird.

Privaten Schlüssel eines Zertifikat aus dem Windows Zertifikatsspeicher exportieren der als „nicht exportierbar“ markiert ist

Manchmal findet sich ein Zertifikat im Windows-Zertifikatsspeicher (Cryptostore), welches man einschliesslich des zugehörigen privaten Schlüssel benötigt.

Beispielsweise kommt das vor bei einer Migration (IIS, Webserver), einem VPN-Service (RRAS) oder Software, die selber eine Schlüsselprüfung durchführen möchte. Windows verbietet allerdings den Export direkt aus dem Cryptostore, unabhängig von den Berechtigungen auf dem Schlüssel.

Die zugehörige Option im Zertifikatsmanager-Assistenten ist daher auch ausgegraut:

Lösung

  1. Windows Defender ausschalten
  2. mimikatz herunterladen (https://github.com/gentilkiwi/mimikatz/releases), am besten den aktuellen trunk
  3. mimikatz „Als Administrator“ ausführen

In mimikatz Ausführen:

privilege::debug

crypto::cng

crypto::capi

crypto::certificates /systemstore:local_machine /store:my /export

Die Ausgabe sollte in etwa wie folgt aussehen:

mimikatz # privilege::debug
 Privilege '20' OK

mimikatz # crypto::cng
 ERROR kull_m_patch_genericProcessOrServiceFromBuild ; kull_m_patch (0x00000000)

mimikatz # crypto::capi
Local CryptoAPI RSA CSP patched
Local CryptoAPI DSS CSP patched

mimikatz # crypto::certificates /systemstore:local_machine /store:my /export
 * System Store  : 'local_machine' (0x00020000)
 * Store         : 'my'

 0. [IIS] <CERTNAME>
    Subject  : CN=<CERT-CN>
    Issuer   : C=<CERT-DATA>
    Serial   : <CERT-SERIAL>
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : <CERT-VALID>
    Hash SHA1: <CERT-HASH>
        Key Container  : {<CNG-ID>}
        Provider       : Microsoft RSA SChannel Cryptographic Provider
        Provider type  : RSA_SCHANNEL (12)
        Type           : AT_KEYEXCHANGE (0x00000001)
        |Provider name : Microsoft RSA SChannel Cryptographic Provider
        |Key Container : {<MACHINE CNG ID>}
        |Unique name   : <CERT-NAME>
        |Implementation: CRYPT_IMPL_SOFTWARE ;
        Algorithm      : CALG_RSA_KEYX
        Key size       : 3072 (0x00000c00)
        Key permissions: 0000003b ( CRYPT_ENCRYPT ; CRYPT_DECRYPT ; CRYPT_READ ; CRYPT_WRITE ; CRYPT_MAC ; )
        Exportable key : NO
        Public export  : OK - '<PATH TO DER>'
        Private export : OK - '<PATH TO PFX>'

Und schon findet man die (alle) Zertifikate aus dem lokalen Speicher im Ausführungsverzeichnis.

Einfaches WordPress Backup via Bash-Script

Bevor ich beim nächsten Fall schon wieder alles einzeln zusammensuche, hier eine kleine und schnelle Copypasta aus dem Admin-Alltag:

Sicherung einer WordPress-Instanz

Achtung: WordPress wird damit zwar vollständig eingepackt und die Datenbank gesichert, aber es gibt keine Fehlerbehandlung (Datei existiert bereits …) und auch keinen CSRF-Schutz. Die Kommandozeilen-Argumente werden un-escaped ausgeführt.

⚠ Das Backup landet automatisch in ~/priv wenn man den zweiten Parameter weglässt.

Syntax:

./wordpress-backup.sh /var/www/path-to-wordpress

Code:

#!/bin/bash
#
# SEHR einfaches WordPress-Backup

# Commandline-Argumente da?
if [ $# -eq 0 ]; then
    echo "SYNTAX: wordpress-backup.sh <path-to-WordPress> <path-to-BackupFolder> [dbonly]"
    exit 1
fi

wpdir=$1
bakdir=$2

# Backupverzeichnis angegeben?
if [ -z "$bakdir" ]; then
    bakdir="~/priv"
fi

# Verzeichnisse da?
if [ ! -d $wpdir ]; then
    echo "Directory $wpdir does not exist."
    exit 1
fi
if [ ! -d $bakdir ]; then
    echo "Directory $bakdir does not exist."
    exit 1
fi

# Sinnvolle Dateinamen zusammenbauen
db_backup_name="wp-db-backup-"`date "+%Y%m%d"`".sql.gz"
wpfiles_backup_name="wp-files-backup-"`date "+%Y%m%d"`

# Zugangsdaten aus der config suchen
db_name=`grep DB_NAME $wpdir/wp-config.php | cut -d \' -f 4`
db_username=`grep DB_USER $wpdir/wp-config.php | cut -d \' -f 4`
db_password=`grep DB_PASSWORD $wpdir/wp-config.php | cut -d \' -f 4`

# MySQLdump, gzip
mysqldump --opt -u$db_username -p$db_password $db_name | gzip > $bakdir/$db_backup_name

# Nur wenn der dbonly Parameter nicht gesetzt ist
if [ ! "$3" = "dbonly" ]; then
    # WordPress einpacken
    tar -czvf $bakdir/$wpfiles_backup_name.tar.gz $wpdir

    # Oder als zip:
    #zip -r $bakdir/$wpfiles_backup_name $wpdir
fi

In RDP-Sitzungen (Remotedesktopverbindung) funktioniert auf einmal „kopieren“ und „einfügen“ nicht mehr

In einigen RDP-Sessions funktionieren plötzlich „kopieren und einfügen“ nicht mehr. Gestern ging’s noch, heute nicht mehr. In einer Sitzung kopieren, in eine andere einfügen geht nimmer. Auch Sitzung abmelden und anmelden bringt keine Besserung, copy+paste ist kaputt. Es ist davon auszugehen, das die Einstellung im Client richtig ist, also die Zwischenablage eingeschaltet ist (Lokale Ressourcen > Zwischenablage angehakt).

Der Fix ist einfach: Auf beiden Seiten (sowohl Sever als auch Client) den Prozess „rdpclip.exe“ beenden und neu starten. Dann gehts wieder. Dieser Bug ist erst knappe 8 Jahre bekannt, von einem Patch gehen wir also in nächster Zeit nicht aus. RDPCLIP beendet seine Abeit, wenn in einem Zwischenablage-Vorgang die Verbindung beendet wird. Passiert gerne mal wenn man eine größere Datei oder Textmenge kopiert und ein WLAN abreißt.

Lösung:

c:\> taskkill /IM "rdpclip.exe" /f && %SystemRoot%\System32\rdpclip.exe

(Auf Server UND Client ausführen)