The file name is too long – Löschen langer Pfade mit der Windows API

Lange Dateinamen und Pfade sind unter Windows eigentlich kein Thema mehr. Dennoch tauchen sie wie ein schlechter Traum, immer wieder auf und stellen einen vor das Problem, wie kann ich diesen langen Dateinamen oder Pfad nun löschen?

:: der normale Ansatz mit rd und dem Verzeichnis
E:\Shares\Projekte-2018> rd 20-old /s /q

Lieferte wie zu erwarten das folgende Ergebnis, mit einer Menge von nicht gelöschten Verzeichnissen und Dateien.

image

The file name is too long.

In diesem Beitrag aus dem Jahr 2011 hatte ich schon mal ein Skript mit Robocopy vorgestellt, welches das Problem bei mir zumindest, immer lösen konnte. Allerdings gab es auch einen Kommentar, der die Funktion des Skriptes nicht bestätigen konnte, zumindest nicht für sein Problem mit NetBeans. Eine genaue Validierung des Problems blieb aber aus.

Nun, knapp 12 Jahre danach habe ich mir, aufgrund einer aktuellen Aufgabenstellung darüber wieder Gedanken gemacht und dazu die Windows API verwendet.

:: der Ansatz mit rd über die Windows API
rd \\?\e:\Shares\Projekte-2018\20-old /s /q

Was wiederum nicht funktioniert hat, und mit dem gleichen Ergebnis “The file name is too long.” endete.

Nun besteht seit Windows 10 Version 1607 (und damit auch für den Windows Server 2016) die Möglichkeit “Enable Long Paths” in der Registry oder per GPO zu aktivieren.

image

Maximum Path Length Limitation – Win32 apps | Microsoft Learn

Die Einstellung hatte ich per GPO und einem entsprechendem gpupdate schon auf den Servern bereitgestellt.

Den Artikel sollte man sorgfältig lesen, denn dort werden Dateiverwaltungsfunktionen aufgelistet, welche nach dem Setzen des Registrierungsschlüssel NICHT mehr der MAX_PATH-Einschränkung unterliegen. Was mich wiederum auf die Idee gebracht hat die Sache mit PowerShell und .Net (Directory Class) zu versuchen.

# PowerShell mit .Net Directory Class
[System.IO.Directory]::Delete("E:\Shares\Projekte-2018\20-old", $true)

Damit der Aufruf funktioniert, muss man zwei Dinge beachten.

  1. Der Verzeichnisname muss vollständig übergeben werden, also nicht 20-old sondern E:\Shares\Projekte-2018\20-old
  2. Die Verzeichnisse sind nicht leer und darum benötigen wir noch ein $true um diese ohne Nachfrage zu löschen

Und den dritten Punkt hätte ich beinahe vergessen, Geduld! Das Löschen von ~500GB hat mehrere Stunden gedauert und kam mit der folgenden Meldung zu einem Ende.image

Es war am Ende eine Datei, die das vollständige Löschen verhindert hat. Auf dieser waren, aus welchem Grund auch immer, die ACL verbogen. Also nochmals icacls, wie in diesem Beitrag beschrieben drüber laufen lassen und der erneute Aufruf von [System.IO …] konnte alle restlichen Artefakte entfernen.

So, eigentlich wollte ich nur ein Verzeichnis löschen …

Enjoy it, b!

Windows SBE remotewebaccess.com Update schlägt fehlt

Mit dem Beginn dieser Woche (KW11/2021) waren einige meiner auf Windows Server 2012R2 basierenden Small Business Essential Server nicht mehr in der Lage ihre für den Anywhere-Access notwendige Sub-Domain unter remotewebaccess.com zu aktualisieren. Genau genommen betrifft das Problem alle SBE, aber manche haben eine statische IP-Adresse und was sich nicht ändert, muss man auch nicht aktualisieren. Die Problem-Kandidaten waren also Kunden (Telekom- und 1&1 ) die täglich eine neue dynamische IPv4-Adresse vom Provider bekommen.
image

Damit klappte natürlich auch der Zugang auf https://sbe.remotewebaccess.com/remote nicht mehr. Da hinter dem Zugang über remotewebaccess.com ein Zertifikat steckt, hat auch ein Zugang über “nur” die IP nicht gut funktioniert.

Das Fehlerbild war dubios, bis ich die Idee hatte das möglicher Weise der auf dem SBE laufende Update Client ein Problem mit der Verschlüsselung haben könnte. Stichwort TLS 1.0, TLS 1.1 Deaktivierung durch Microsoft.

Wenn man einen Blick auf die Release Documentation for Windows Server Essentials wirft, findet man zum eine Aktualisierung von 10.03.2021 …

image

… und dazu den folgenden Absatz.

image

Auch der Windows Server Essentials soll TLS 1.2 nutzen, Nach diesem Absatz dachte ich, OK – das ist es nicht, der Windows Server 2012R2 und neuer verwenden automatisch TLS.

image

Diese Aussage trifft zwar auf den Windows Server selbst zu, aber für das .Net Framework war dennoch ein wenig Nacharbeit notwendig und damit war ich auch auf die Lösung des Problems gestoßen.

Für beide auf dem Server installierten .Net Versionen (v2.0.50727 und v4.0.30319) mussten die folgenden Einträge in die Registry zusätzlich eingetragen werden.

# 64-bit OS
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001
# 32-bit Applications running on 64-bit OS
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001

Mit PowerShell geht das sehr einfach die Befehle müssen als Administrator in PowerShell (elevated Session) ausgeführt werden.

# PowerShell
New-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727" -Name "SystemDefaultTlsVersions" -Value 1 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727" -Name "SchUseStrongCrypto" -Value 1 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SystemDefaultTlsVersions" -Value 1 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value 1 -PropertyType DWORD -Force

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727" -Name "SystemDefaultTlsVersions" -Value 1 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727" -Name "SchUseStrongCrypto" -Value 1 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SystemDefaultTlsVersions" -Value 1 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value 1 -PropertyType DWORD -Force

Danach noch den Server neu starten (Restart-Computer).

Update 20.03.2021
Für den Windows Server 2012 (OHNE R2) sind neben den oben beschriebenen Einträgen noch die folgenden Keys in der Registry zu setzen

# PowerShell
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" -Name "DefaultSecureProtocols" -Value '0xAA0' -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" -Name "DefaultSecureProtocols" -Value '0xAA0' -PropertyType DWORD -Force

Microsoft bietet hier auch ein eigene Lösung an um den Fix zu installieren. Dazu gibt es weitere Infos hier.

Update 22.03.2021
Das Problem tritt natürlich auch auf dem Windows Server 2016 SBE auf, und kann mit den gleichen Einträgen in der Registry wie für Windows Server 2012R2 behoben werden.

image

Die Abbildung oben zeigt den Fehler des Update-Mechanismus auch im Windows Eventlog unter Microsoft-Windows-ServerEssentials/Admin.

Enjoy it, b!

Windows 7 installiert nicht mehr alle Updates

Manchmal reicht es schon, wenn man sich ein Problem genau anschaut. Neulich hatte ich einen Windows 7 Client welcher partout keine Updates mehr installieren wollte. Der Versuch einzelne Updates zu installieren klappte, oder auch nicht und nach einer Installation wurde beim nächsten Neustart das System einfach wieder zurückgerollt.

Die Liste der zu installierenden Updates sah wie folgt aus:

image

Wenn wir uns die Liste genau anschauen, dann ist zu sehen das die Updates für das .Net Framework seit April ausstehen, Windows Updates hingegen (zumindest überwiegend) installiert wurden.

Mein erster Schritt in diesem Fall war eine Reparatur des .Net Frameworks, für die Microsoft das folgende Tool anbietet.

https://www.microsoft.com/en-us/download/details.aspx?id=30135

Nach der Reparatur konnten alle ausstehenden Updates ohne Probleme installiert werden,

Enjoy it, b!