Auf meinem Windows-Computer hatte ich einen Ordner mit einem Namen von vier Punkten, der wie eine Art Kaninchenloch wirkt - wie ist das passiert?

34705
Dirk Boer

Der Ordnername wurde mit nur vier Punkten im Datei-Explorer aufgelistet .....

Als ich versuchte, es zu öffnen, kam ich in eine Art endlose Kaninchenlochschleife, in der ich immer wieder denselben Ordner öffnete - ich konnte das endlos machen. Zeigt den Pfad wie C:\ExamplePath\....\....\....\....\....usw.

Es hängte meine TypeScript-Kompilierung in einem bestimmten Projekt. Es dauerte mehr als ein Jahr, bis ich diesen Ordner und die damit verbundenen Probleme gefunden hatte, da er tief in verschachtelten Ordnern verwurzelt war. Ich habe nie erwartet, dass es so etwas gibt, also habe ich nie danach gesucht.

Ich konnte den Ordner aufgrund des speziellen Namens nicht wie üblich löschen. Am Ende konnte ich es entfernen, indem Sie die Befehlszeile verwenden und den übergeordneten Ordner mit löschen rd /s /q path.

Danach habe ich versucht, den Ordner erneut zu erstellen, konnte dies jedoch weder mit dem Datei-Explorer noch mit der Befehlszeile tun.

In meinen mehr als 20 Jahren Erfahrung mit Windows habe ich diesen Fehler noch nie gesehen, daher kann ich mir vorstellen, dass dies wirklich ein ärgerliches und verwirrendes Problem für Amateurbenutzer sein würde.

Weiß jemand, wie dies geschehen konnte und wie dieses Problem reproduziert werden kann?

Aktualisieren

Für interessierte Personen: Dieser Pfad befand sich tief in einem TFS-Ordner. Also verwendet TFS wahrscheinlich die Umgehungsmethode @grawity ( "Verschiedene Dateimanager, Archivierer usw." ).

Bin ich auf einen seltenen TFS-Fehler gestoßen?

196
Die Antworten unten beschreiben, was passiert, wie man es absichtlich reproduziert und wie man es repariert, aber sie erwähnen nicht, warum es passiert ist. Da ".." in einem Pfad verwendet werden kann, um "einen Ordner nach oben" anzuzeigen, würde ich vermuten, dass irgendwo entlang der Linie ein Programm oder ein Skript zwei Strings verkettet, um einen Pfad zu erstellen, einer endete mit ".." , und die nächste begann mit "..", und da eine der unten genannten Techniken verwendet wurde, gelang es, den Pfad zu erstellen, obwohl das Trennzeichen zwischen den Ordnern fehlte. 3D1T0R vor 5 Jahren 5
seltsame Dinge können auch passieren, wenn Sie einen Ordner mit Leerzeichen im Namen erstellen phuclv vor 5 Jahren 5
Ist dieser Server im Internet? Nur um Sie zu warnen, sehe ich regelmäßig Hackversuche auf Internetseiten mit Webservern mit der Aufforderung: `GET / .... \\ .... \\ .... \\ .... \\ .... \\. ... \\ .... \\ .... \\ .... \\ winnt \\ win.ini`. Offensichtlich gibt / gab es eine Schwachstelle, die versucht wird, dies auszunutzen. Andy Brown vor 5 Jahren 6
@AndyBrown ist viel wahrscheinlicher "..", nicht "....". Es ist einfach ein Weg, um nach "\ winnt" zu gelangen, unabhängig von der Tiefe des Startpunkts (der Web-Wurzel), solange der Startpunkt weniger als 9 Ebenen tief ist. Es verlässt sich auf die Tatsache, dass Sie im Wurzelverzeichnis ".." gehen, wenn Sie sich im Wurzelverzeichnis befinden. hobbs vor 5 Jahren 4
@hobbs Ja, aber Webserver suchen oft nach `..` user20574 vor 5 Jahren 0
@hobbs Das ist ein Kopieren und Einfügen aus dem Apache-Zugriffsprotokoll unter Linux. Auf jeden Fall 4 Punkte da. Es wurden noch weitere Hack-Versuche protokolliert, die _do_ `` verwenden. Deshalb fand ich dieses ziemlich seltsam. Andy Brown vor 5 Jahren 5
@AndyBrown: Es gab _was, _ [vor fast zwei Jahrzehnten.] (Https://www.kb.cert.org/vuls/id/111677) Das letzte Betriebssystem, das standardmäßig in "C: \ WINNT" installiert wurde, war Windows 2000 Aber auch das hätte "..." benutzt, keine andere Anzahl von Punkten. grawity vor 5 Jahren 3
Es gibt eine hochrelevante xkcd (# 981), aber da der Titel etwas NSFW ist, werde ich ihn hier nicht direkt verlinken ... tonysdg vor 5 Jahren 3

3 Antworten auf die Frage

302
grawity

In Win32 können Sie keine Dateien oder Ordner erstellen, deren Namen auf enden. .Alle Punkte werden vom Ende entfernt. Der Versuch, test.Marken zu erstellen, testerscheint stattdessen. (Dies ist für die Kompatibilität mit 8.3-Namen in alter DOS / Win9x-Ära-Software.)

Jedes Mal, wenn Sie versuchen, auf einen Ordner mit dem Namen zuzugreifen ...., wird sein Name auf die leere Zeichenfolge reduziert, und Sie kehren zu dem Ordner zurück, in dem Sie sich zuvor befanden.

Der NT-Kernel erlaubt jedoch solche Namen. Es gibt verschiedene Mechanismen, die die durch Win32-APIs auferlegten Dateinamensbeschränkungen umgehen. Beispielsweise wird WSL (Windows Subsystem for Linux) nicht auf Win32 ausgeführt und ist davon nicht betroffen. Es gibt auch die \\?\Bypass-Methode, eine bewusste "Backdoor" für Programme, die wissen, was sie tun. Auch wenn Sie nicht erstellen können C:\Example\....\, können Sie auch gut erstellen \\?\C:\Example\....\.

Ebenso können Sie solche Verzeichnisse mit rmdir \\?\C:\path\...Cmd löschen (ich habe es noch nicht mit PowerShell getestet).

Verschiedene Dateimanager, Archivierer usw. verwenden die \\?\Methode möglicherweise, um längere Pfadnamen als üblich verwenden zu können. Dadurch sind sie auch vom Kompatibilitätscode in Win32 nicht betroffen. Sie umgehen das Punktstrippen sowie die Übersetzung von magischen Dateinamen wie CONoder NUL.

Es könnte also eines Ihrer Programme sein:

  1. verwendet immer, \\?\um auf Dateien zuzugreifen,
  2. Ich habe versehentlich versucht, einen Ordner mit dem Namen zu erstellen ....- aber es ist nicht wirklich möglich, sicher zu wissen.
Eine andere Möglichkeit zum Erstellen von Dateien / Ordnern mit "BAD" -Namen besteht in einer Linux- oder Mac-Maschine auf einer Dateifreigabe, die auf der Windows-Maschine gehostet wird. Tonny vor 5 Jahren 0
Eine andere Möglichkeit zum Erstellen eines solchen Ordners besteht in der Verwendung alternativer Datenströme. Auf der cmd: `echo" "> .... :: $ INDEX_ALLOCATION". Dadurch wird ein Ordner mit dem Namen `....` erstellt (der immer noch auf den aktuellen Ordner verweist). WorldSEnder vor 5 Jahren 13
Interessant, jetzt muss jemand dies nur in einer Windows 98-VM einrichten. pipe vor 5 Jahren 0
@DirkBoer Ich habe folgendes gefunden: https://docs.microsoft.com/de-de/dotnet/standard/io/file-path-formats#skipping-normalization user31389 vor 5 Jahren 2
Microsoft nennt dies "Extended Path Prefix" und Pfade mit diesem Präfix werden "Pfade mit erweiterter Länge" genannt. (lustig: Wenn Sie in .NET [Referenzquelle] (https://referencesource.microsoft.com/#q=%5C%5C%5F%5F%5C%22) nach `\\? \" suchen, führt dies dazu ein Laufzeitfehler auf ihrem Server). dlatikay vor 5 Jahren 124
@Grawity So. . . Wie kann ich diesen Ordner jetzt löschen? Shadow503 vor 5 Jahren 2
@DirkBoer http://msdn.microsoft.com/de-de/library/aa365247(VS.85).aspx grawity vor 5 Jahren 1
@WorldSEnder: Nun, das ist einfach nur böse. grawity vor 5 Jahren 1
Viel Spaß mit Ihrem Verzeichnis \. (Ja, es ist möglich, aber nicht durch \\? \ Allein.) Joshua vor 5 Jahren 1
Ich hatte einen neugierigen 'Computerreparatur'-Client-Fall, bei dem der Client jedes Mal, wenn er ein Konto auf einem Windows-Computer erstellt hatte, einwandfrei funktionieren würde, aber sobald er sich angemeldet hatte / neu startete, ließ er ihn nicht in sein Konto, sondern machte ein temporäres Konto für den Computer Session. Die örtliche PC-Werkstatt war verblüfft (belastet ihn immer noch). Es stellte sich heraus, dass sein tatsächlicher Name Con ist und er hat immer seinen Namen für sein Windows-Konto verwendet. An diesem Tag habe ich erfahren, dass es mehr als nur "com1" als magischen Dateinamen gab RozzA vor 5 Jahren 21
@RozzA - interessant. Hier ist eine SU-Frage zu demselben Problem: https://superuser.com/questions/915779/cannot-create-user-account-named-con-under-windows-7 Pikamander2 vor 5 Jahren 2
Windows 8 lässt mich nicht meinen Ordner mit "...." :( Black Thunder vor 5 Jahren 0
Ich kann mir vorstellen, dass die Funktion [NtCreateFile ()] (https://docs.microsoft.com/de-de/windows/desktop/api/winternl/nf-winternl-ntcreatefile) diesen Ordner ohne Probleme erstellen kann. hanshenrik vor 5 Jahren 2
@dlatikay Mit Blick auf das Traceback sollte es in [this] (https://github.com/KirillOsenkov/SourceBrowser/commit/c1a621e41121d5ce65d9877857b4e8e7707b661e) behoben werden. user202729 vor 5 Jahren 0
@ BlackThunder Hast du die Antwort gelesen? Sie sollten es nicht auf normale Weise erstellen können. wizzwizz4 vor 5 Jahren 0
@ wizzwizz4 Ja. Black Thunder vor 5 Jahren 0
Komischerweise musste sich mein Vater vor vielen Jahren mit einem ähnlichen Problem auseinandersetzen. Mein Bruder hat DOOM (von 1993) auf dem Heim-PC installiert. Dies war wahrscheinlich um 1995, als dies geschah. Der Installer führte irgendwie Korruption ein. Mein Vater fand schließlich heraus, dass C: \ alle regulären Ordner (C: \ DOS, C: \ WIN usw.) sowie Hunderte identischer C: \ DOOMDATA-Ordner enthielt. Jeder Unterordner hatte dann auch eine "Kopie" von jedem anderen Ordner (C: \ WIN hatte also eine Kopie von C: \ WIN, C: \ DOS und allen DOOMDATA-Ordnern). Es ist komisch zu glauben, dass wir Symlinks hatten, bevor Symlinks eine Sache waren. xD zaTricky vor 5 Jahren 1
22
user1532080

Zusätzlich zu @ grawitys Antwort kann ein Win32-Programm dies auch tun, indem die native API direkt aufgerufen wird. Wenn ich mich nicht irre, wäre das im vorliegenden Fall NtCreateDirectoryObject. Diese Aufrufe sind heutzutage ziemlich gut dokumentiert, insbesondere ihr Kernel-Pendant (das Sie nicht von einem Win32-Programm aus aufrufen können), in diesem Fall ZwCreateDirectoryObject.

Im Hinblick auf die "unendliche Tiefe" können Sie auf einfache Weise Links verwenden. Erstellen Sie ein Verzeichnis, erstellen Sie darin eine Junction (Sie können es mklink /jzum Beispiel verwenden), und Sie erhalten eine sehr tiefe Struktur. Das letzte Mal, als ich dies unter Windows 2000 tat, war die Rekursion zu Ende (Sie konnten nicht "unendlich graben"). Bei neueren Betriebssystemen ist das Limit möglicherweise größer oder wird entfernt. Sie können beispielsweise 10 Verzeichnisse erstellen, die jeweils ein Kind des vorherigen sind, und im 10. Verzeichnis einen Link zum ersten erstellen.

Das ist möglicherweise böses Genie-Material genau dort ... Agi Hammerthief vor 5 Jahren 3
Ich habe vollständige Verzeichnisse in ähnlicher Weise kopiert, um die Disc künstlich aufzufüllen, um zu testen, wann sie sich einem festgelegten Grenzwert näherte. mickeyf vor 5 Jahren 1
Es ist auch möglich, mit cygwins `mkdir .... 'zu reproduzieren lucidbrot vor 5 Jahren 0
17
Larryc

Es gibt eine einfachere Möglichkeit, das Verzeichnis zu erstellen. Geben Sie an der Eingabeaufforderung Folgendes ein:

MD ....\

Wenn Sie die Eingabetaste drücken, wird ein Verzeichnis mit vier Punkten erstellt. Dieses Verzeichnis kann auch mit dem Explorer angezeigt werden.

Es gibt einen Fehler in MS-DOS, der auf Version 1.0 zurückgeht. MS weiß es seit einiger Zeit, konnte es aber nicht beheben. Sie haben das Problem mit PowerShell behoben.

BTW, wenn Sie versuchen:

RD ....

Es wird nicht gelöscht. Sie müssen diese bestimmte Syntax verwenden, um sie zu entfernen.

RD ....\

Ich verwende dies auf bestimmten Servern, die ich administriere. Ich lege häufig einen Benutzerordner im Stammverzeichnis der Festplatte an, und ich möchte nicht, dass ein anderer Administrator mitkommt und ihn entfernt.

Also gehe ich in meinen Ordner und erstelle einen Unterordner mit den Namen CON, AUX oder LPT usw.

Wenn ein anderer Administrator meinen Ordner entfernen möchte, muss er wissen, wie dieser Unterordner entfernt werden muss.

EDIT: Ich habe heute Morgen über diese Diskussion nachgedacht und beschlossen, einen Schritt weiter zu gehen. Ich gehe davon aus, dass die Mods entscheiden werden, ob dies relevant ist.

Ich kann nicht in den Ordner einlegen.

Bedenken Sie, wenn ich MD c: \ teste, dann CD C: \ test und MD .... \ endete ich mit C: \ test ....

und alles ist gut.

Aber CD ... schlägt fehl und kickt mich zurück zu C: \ test. (CD .... \ macht dasselbe.)

Ich kann jedoch DIR .... und bekomme ein Verzeichnis. ich kann auch

MD C: \ test .... \ temp und erstellt dieses Unterverzeichnis in ....

Ich kann auch CD C: \ testen .... \ temp und in dieses Sub-Sub-Verzeichnis gehen.

Aber während in C: \ test .... \ temp, wenn ich CD .. bin ich wieder in C: \ test.

Ich kann nicht in dieses Verzeichnis cd, aber ich kann den Ordner bearbeiten, indem er Unterordner erstellt und interessant genug ist

ECHO "Testen" >> C: \ test .... \ test.txt

funktioniert auch und erstellt eine Datei in diesem Ordner. So kann ich einen Ordner mit vier Punkten erstellen, Dateien und Ordner hinzufügen, Verzeichnisse davon abrufen, aber keine CD darin. Könnte es eine Art böses Genie dafür geben? Ich entschuldige mich bei den Mods, wenn ich zu weit vom Kurs abgekommen bin.

Das klingt eher nach einem Win32-API-Fehler, da die Eingabeaufforderung seit ungefähr zwanzig Jahren nicht mehr "MS-DOS" ist. grawity vor 5 Jahren 6
Wenn ich versuche, das Verzeichnis im Windows Explorer zu löschen, stürzt es ab, wenn ich es mit Ihrer Version erstellt habe. Wenn ich es mit cygwin erstellt habe, versagt es einfach und sagt es. lucidbrot vor 5 Jahren 2
Ich habe ein DOS 3.3 und ein DOS 6.0 Computer und die Befehle funktionieren auf ihnen. Als sie auf 32 Bit wechselten, war das Problem immer noch da. es funktioniert im CMD-Fenster von win95 bis heute einschließlich aller Server-Versionen. Jetzt, wo wir auf Powershell umsteigen, funktioniert es nicht mehr. Nachdem ich geschrieben hatte, stellte ich fest, dass das Verzeichnis zwar erstellt wird, aber nicht den Effekt hat, den das OP sah. Wenn ich versuche, mit vier Punkten in das Verzeichnis zu kopieren, wird ich einfach wieder rausgeschmissen. Larryc vor 5 Jahren 0
Auf meinem Windows 7-Rechner erstellt `MD .... \` nur `.... \ ....` Baum - es gibt nur einen Rekursionsschritt. Tomáš Zato vor 5 Jahren 0
Neugierig [FAR-Manager] (https://www.farmanager.com/) betrachtet dies in keiner Weise als besonders und erstellt / renames / löscht / listet den Inhalt von Verzeichnissen mit dem Namen "viele Punkte" ohne Probleme auf alles. RomanSt vor 5 Jahren 0
Erhalten Sie dasselbe Ergebnis mit `.. \ ..`, dh einer Datei mit dem Namenspräfix `.. \.` Und leerem Suffix, das DOS als "...." rendern würde? Eric Towers vor 5 Jahren 0