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

198

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

Als ich versuchte, es zu öffnen, stieß ich auf eine Art endlose Hasenlochschleife, in der ich genau denselben Ordner immer wieder öffnete - ich konnte das endlos tun. Den Weg zeigen wie C:\ExamplePath\....\....\....\....\...., etc.

Meine TypeScript-Zusammenstellung hing in einem bestimmten Projekt. Es hat mehr als ein Jahr gedauert, bis ich diesen Ordner und die damit verbundenen Probleme gefunden habe, da er tief in verschachtelten Ordnern verwurzelt war. Ich habe nie mit einem solchen Problem gerechnet, also habe ich nie danach gesucht.

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

Danach habe ich versucht, den Ordner erneut zu erstellen, konnte dies jedoch nicht sowohl mit dem Datei-Explorer als auch mit der Befehlszeile tun.

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

Weiß jemand, wie das hätte passieren können und wie man dieses Problem reproduziert?

Aktualisieren

Für Interessenten: Dieser Pfad befand sich tief in einem TFS-Ordner. Wahrscheinlich verwendet TFS die erläuterte Bypass-Methode @grawity ( "Verschiedene Dateimanager, Archivierer usw." ).

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

Dirk Boer
quelle
5
In den folgenden Antworten wird detailliert beschrieben, was passiert, wie es absichtlich reproduziert und wie es repariert wird, aber sie erwähnen nicht, warum es passiert ist. Da ..es in einem Pfad verwendet werden kann, um anzuzeigen, dass ein Ordner aufwärts geht, würde ich vermuten, dass ein Programm oder ein Skript irgendwo entlang der Linie zwei Zeichenfolgen verkettet hat, um einen Pfad zu erstellen. Eine endete mit ..und die nächste begann mit ..und Da eine der unten genannten Techniken verwendet wurde, konnte der Pfad erfolgreich erstellt werden, obwohl das Ordnertrennzeichen dazwischen fehlte.
3D1T0R
6
seltsame Dinge passieren auch, wenn Sie einen Ordner mit nur Leerzeichen im Namen
erstellen
7
Ist dieser Server im Internet? Nur Sie zu warnen regelmäßig Web - Server sehen Hack - Versuche im Internet ich mit Blick auf anfordernden: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Offensichtlich gibt es irgendwo eine Sicherheitslücke, die diese auszunutzen versucht.
Andy Brown
4
@AndyBrown viel wahrscheinlicher ist das ..nicht ..... Es ist einfach eine Möglichkeit, \winntunabhängig von der Tiefe des Startpunkts (der Webwurzel) dorthin zu gelangen , sofern der Startpunkt weniger als 9 Ebenen tief ist. Es beruht auf der Tatsache, dass ..Sie beim Verlassen des Stammverzeichnisses im Stammverzeichnis verbleiben.
Hobbs
5
@hobbs Das ist ein Kopieren und Einfügen aus dem Apache-Zugriffsprotokoll unter Linux. Auf jeden Fall 4 Punkte drin. Es gibt noch andere Hack - Versuche protokolliert, tun Verwendung ..weshalb ich dieses ziemlich seltsam gefunden.
Andy Brown

Antworten:

303

Mit Win32 können Sie keine Dateien oder Ordner erstellen, deren Namen auf enden .- alle Punkte werden am Ende entfernt. Stattdessen wird versucht, test.Marken zu erstellen test. (Dies dient der Kompatibilität mit 8.3-Namen in alter DOS / Win9x-Software.)

Wenn Sie versuchen, auf einen Ordner mit dem Namen zuzugreifen ...., wird der 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 Dateinamenbeschränkungen umgehen, die von Win32-APIs auferlegt werden. Beispielsweise wird WSL (Windows Subsystem for Linux) nicht über Win32 ausgeführt und ist davon nicht betroffen. Es gibt auch die \\?\Bypass-Methode, eine absichtliche "Hintertür" für Programme, die wissen, was sie tun. Auch wenn Sie nicht erstellen können C:\Example\....\, können Sie ganz gut erstellen \\?\C:\Example\....\.

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

Verschiedene Dateimanager, Archivierer usw. verwenden diese \\?\Methode möglicherweise , um längere Pfadnamen als üblich zu verwenden. Auf diese Weise werden sie auch nicht vom Kompatibilitätscode in Win32 beeinflusst. Sie umgehen das Entfernen von Punkten sowie die Übersetzung von magischen Dateinamen wie CONoder NUL.

So könnte es sein, dass eines Ihrer Programme:

  1. immer verwendet, \\?\um auf Dateien zuzugreifen,
  2. versehentlich versucht, einen Ordner mit dem Namen zu erstellen ....- aber es ist nicht wirklich möglich, sicher zu wissen, nach der Tatsache.
Grawity
quelle
13
Eine andere Möglichkeit, einen solchen Ordner zu erstellen, besteht darin, alternative Datenströme zu verwenden. Auf dem cmd: echo "" > ....::$INDEX_ALLOCATION. Dadurch wird ein Ordner mit dem Namen erstellt ....(der weiterhin auf den aktuellen Ordner verweist).
WorldSEnder
2
@DirkBoer Ich habe folgendes gefunden: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389
124
Microsoft nennt dies das "Extended Path Prefix", und Pfade mit diesem Präfix werden als "Pfade mit erweiterter Länge" bezeichnet. (Witzig: Wenn Sie \\?\"in der .NET- Referenzquelle nach suchen , verursacht dies einen Laufzeitfehler auf ihrem Server.)
Dienstag,
2
@ Grawity Also. . . Wie gehe ich vor, um diesen Ordner jetzt zu löschen?
Shadow503
21
Ich hatte einen seltsamen "Computerreparatur" -Kundenfall, in dem der Kunde immer dann, wenn er ein Konto auf einem Windows-Computer erstellte, einwandfrei funktionierte, aber sobald er sich angemeldet / neu gestartet hatte, ließ er ihn nicht in sein Konto ein, sondern erstellte ein temporäres Konto für das Session. Die örtliche PC-Werkstatt war ratlos (beschuldigte ihn noch). Es stellte sich heraus, dass sein tatsächlicher Name Con ist und er seinen Namen immer für sein Windows-Konto verwendet hat ..... an diesem Tag erfuhr ich, dass es mehr als nur com1einen magischen Dateinamen gab
RozzA
23

Zusätzlich zu der Antwort von @ grawity kann ein Win32-Programm dies auch tun, indem es die "native" API direkt aufruft. Wenn ich mich nicht irre, wäre das im vorliegenden Fall NtCreateDirectoryObject. Diese Aufrufe sind heutzutage ziemlich gut dokumentiert, insbesondere das Gegenstück zum Kernel (das Sie nicht aus einem Win32-Programm aufrufen können), in diesem Fall ZwCreateDirectoryObject.

In Bezug auf die "unendliche Tiefe" ist die Verwendung von Links eine einfache Möglichkeit, dies zu erreichen. Erstellen Sie ein Verzeichnis und erstellen Sie dann in diesem eine Verknüpfung (die Sie beispielsweise verwenden können mklink /j), und Sie erhalten eine sehr tiefe Struktur. Das letzte Mal, als ich dies unter Windows 2000 tat, gab es ein Ende der Rekursion (man konnte nicht "unendlich graben"). Unter neueren Betriebssystemen ist die Beschränkung möglicherweise größer oder aufgehoben. Sie können auch beispielsweise 10 Verzeichnisse erstellen, die jeweils ein untergeordnetes Verzeichnis des vorherigen sind, und im zehnten einen Link zum ersten erstellen.

user1532080
quelle
4
Das ist sehr wahrscheinlich böses geniales Material ...
Agi Hammerthief
1
In ähnlicher Weise habe ich vollständige Verzeichnisse kopiert, um die Disc zum Testen künstlich aufzufüllen und festzustellen, wann sie sich einem festgelegten Grenzwert nähert.
Mickeyf
Es ist auch möglich, mit cygwin'smkdir ....
lucidbrot
18

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

MD ....\

und drücke Enter, es 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 hat es schon länger gewusst, konnte oder wollte es aber nicht beheben. Sie haben das Problem mit PowerShell behoben.

Übrigens, wenn Sie versuchen:

RD ....

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

RD ....\

Ich verwende dies auf bestimmten Servern, die ich verwalte. Ich erstelle oft einen Benutzerordner im Stammverzeichnis der Festplatte und möchte nicht, dass ein anderer Administrator dazukommt und ihn entfernt.

Also gehe ich in meinen Ordner und erstelle einen Unterordner namens CON, AUX oder LPT, etc ...

Wenn ein anderer Administrator meinen Ordner entfernen möchte, muss er zunächst wissen, wie dieser Unterordner entfernt wird.

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

Ich kann keine CD in den Ordner einlegen.

Überlegen Sie, ob ich MD c: \ teste, dann CD C: \ teste und MD .... \. Am Ende habe ich C: \ teste ....

und alles ist gut.

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

Allerdings kann ich DIR .... und dir eine Auflistung holen. ich kann auch

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

Ich kann auch CD C: \ test .... \ temp und in dieses Unterverzeichnis gehen.

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

Ich kann keine CDs in dieses Verzeichnis kopieren, aber ich kann den Ordner bearbeiten, indem ich Unterordner erstelle, und das ist interessant genug

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

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

Larryc
quelle
6
Das klingt eher nach einem Win32-API-Fehler, da die Eingabeaufforderung seit etwa zwanzig Jahren nicht mehr "MS-DOS" ist.
Grawity
2
Interessanterweise stürzt das Verzeichnis beim Versuch, es im Windows Explorer zu löschen, ab, als ich es mit Ihrer Version erstellt habe. Wenn ich es mit cygwin erstellt habe, schlägt es einfach fehl und sagt es aus.
Lucidbrot
Ich habe einen DOS 3.3- und einen DOS 6.0-Rechner und die Befehle funktionieren auf ihnen. Als sie auf 32 Bit umstellten, war das Problem immer noch da. Es funktioniert im CMD-Fenster von Win95 bis heute, einschließlich aller Serverversionen. Jetzt, wo wir zu Powershell wechseln, funktioniert es nicht mehr. Nachdem ich geschrieben hatte, stellte ich fest, dass es das Verzeichnis erstellt, aber nicht den Effekt liefert, den das OP sah. Wenn ich versuche, mit vier Punkten eine CD in das Verzeichnis zu kopieren, wirft es mich einfach wieder raus.
Larryc
Auf meinem Windows 7-Computer MD ....` only creates .... \ .... `Baum - es gibt nur einen Rekursionsschritt.
Tomáš Zato
Kurioserweise sieht FAR Manager dies in keiner Weise als besonders an und erstellt / benennt / löscht / listet den Inhalt von Verzeichnissen mit dem Namen "Viele Punkte" ohne Probleme auf.
RomanSt
-1

Ich hatte das gleiche problem In meinem Fall handelte es sich um einen Tippfehler im Befehl für .NET Core Publish:

dotnet publish "Api.csproj" --output "....\output\"

Es wurde das Verzeichnis mit dem Namen '....' erstellt, das ich nicht entfernen oder umbenennen konnte. Dieses Verzeichnis verhält sich wie ein Verweis auf das übergeordnete Verzeichnis. Wenn ich in diesen Ordner gehe, befand ich mich immer noch im übergeordneten Ordner, aber der Pfad wurde von ".... \" angehängt.

Ich habe alle in diesem Thema erwähnten Befehle ausprobiert, aber keiner von ihnen hat funktioniert. Nach meinem Verständnis hat es sich so verhalten, weil ich andere Dateien und Verzeichnisse im übergeordneten Verzeichnis hatte und daher Parameter verwenden musste, mit denen der gesamte Inhalt rekursiv gelöscht werden kann.

Ich fand heraus, dass dieser Befehl:

rmdir /s /q ....\

kann das Verzeichnis '....' entfernen. Es wird nur der Verweis auf das übergeordnete Verzeichnis gelöscht, bei dem es sich eigentlich um das Verzeichnis '....' handelt, nicht mehr und nicht weniger. Trotz der Befehlsargumente:

  • / s - Entfernt den gesamten Inhalt des entfernten Verzeichnisses.
  • / q - wird ohne Bestätigung entfernt,

Das übergeordnete Verzeichnis blieb unberührt.

Mateusz
quelle
Können Sie erklären, warum der zweite Befehl für Sie funktioniert hat?
Burgi
Abstimmen, weil Sie nicht erläutert haben, warum der Befehl funktioniert oder was er bewirkt, z. B. das Löschen des Verzeichnisses, der Unterverzeichnisse und der Dateien.
Winter Faulk
Dadurch wird das Verzeichnis mit dem Namen "...." gelöscht. Es wird nur der Verweis auf das übergeordnete Verzeichnis gelöscht, bei dem es sich eigentlich um das Verzeichnis '....' handelt, nicht mehr und nicht weniger. Ich habe alle in diesem Thema erwähnten Befehle ausprobiert, aber keiner von ihnen funktioniert. Nach meinem Verständnis hat dieser Befehl funktioniert, da ich andere Dateien und Verzeichnisse im übergeordneten Verzeichnis hatte und daher Parameter verwenden musste, mit denen der gesamte Inhalt rekursiv gelöscht werden kann. Trotz der Befehlsargumente blieb das übergeordnete Verzeichnis unberührt.
Mateusz
Irgendwie geriet ich mit Visual Studio in genau dieselbe Situation, und dieser Befehl rettete meinen Speck nach stundenlanger Frustration, um herauszufinden, was los war.
NPNelson