198 votes

Sur ma machine Windows, j'avais un dossier avec un nom à quatre points qui se comportait comme une sorte de terrier de lapin - comment cela est-il arrivé ?

Le nom du dossier était listé dans l'Explorateur de Fichiers avec seulement quatre points. .... .

Lorsque j'ai essayé de l'ouvrir, je me suis retrouvé dans une sorte de boucle sans fin où j'ouvrais exactement le même dossier encore et encore - je pouvais le faire sans fin. En montrant le chemin comme C:\ExamplePath\....\....\....\....\.... etc.

Cela bloquait ma compilation TypeScript dans un projet spécifique. Il m'a fallu plus d'un an avant de trouver ce dossier et ses problèmes connexes, car il était profondément ancré dans des dossiers imbriqués. Je ne m'attendais pas à un tel problème et je ne l'ai donc jamais cherché.

Je n'ai pas pu supprimer le dossier de la manière normale à cause du nom spécial. Finalement, j'ai pu le supprimer en utilisant la ligne de commande et en supprimant le dossier parent avec la commande rd /s /q path .

Ensuite, j'ai essayé de créer à nouveau le dossier, mais je n'y suis pas parvenu, ni avec l'Explorateur de fichiers ni avec la ligne de commande.

En plus de vingt ans d'utilisation de Windows, je n'ai jamais vu ce bogue auparavant. Je peux donc imaginer que ce serait vraiment un problème ennuyeux et déroutant pour les utilisateurs amateurs.

Quelqu'un sait-il comment cela a pu se produire et comment reproduire ce problème ?

Mise à jour

Pour les personnes intéressées : ce chemin était situé profondément dans un dossier TFS. Donc probablement TFS utilise la méthode de contournement expliquée par @grawity ( "Divers gestionnaires de fichiers, archiveurs, etc" )

Est-ce que je suis tombé sur un bug rare de TFS ?

5 votes

Les réponses ci-dessous détaillent ce qui se passe, comment le reproduire intentionnellement et comment le réparer, mais elles ne mentionnent pas pourquoi cela s'est produit. Depuis .. peut être utilisé dans un chemin pour indiquer 'monter d'un dossier', je me hasarderais à penser que quelque part, un programme ou un script a concaténé deux chaînes pour créer un chemin, l'une se terminant par .. et la suivante commençait par .. et comme il a utilisé l'une des techniques mentionnées ci-dessous, il a réussi à créer le chemin, même s'il lui manquait le séparateur de dossiers entre eux.

6 votes

Des choses étranges se produiront également si vous créez un dossier dont le nom ne contient que des espaces.

7 votes

Ce serveur est-il sur Internet ? Juste pour vous prévenir, je vois régulièrement des tentatives de piratage sur des serveurs web tournés vers l'internet qui demandent des informations : GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt‌​\\win.ini . Il est clair qu'il y a/avait une vulnérabilité quelque part que l'on tente d'exploiter.

305voto

James Mertz Points 390

Win32 ne vous permet pas de créer des fichiers ou des dossiers avec des noms se terminant en . - tous les points sont supprimés à la fin. En essayant de créer test. fait test apparaissent à la place. (Ceci est pour la compatibilité avec les noms 8.3 dans les anciens logiciels de l'ère DOS/Win9x).

Par conséquent, chaque fois que vous essayez d'accéder à un dossier nommé .... son nom est réduit à une chaîne vide, et vous êtes de retour dans le dossier où vous étiez auparavant.

Le noyau NT, cependant, permet de tels noms. Il existe plusieurs mécanismes qui permettent de contourner les limitations de noms de fichiers imposées par les API de Win32 - par exemple, WSL (Windows Subsystem for Linux) ne fonctionne pas au-dessus de Win32 et n'est pas affecté par celui-ci. Il existe également le \\?\ méthode de contournement, une "porte dérobée" délibérée laissée aux programmes qui savent ce qu'ils font. Même si vous ne pouvez pas créer C:\Example\....\ vous peut créer \\?\C:\Example\....\ très bien.

De même, vous pouvez supprimer ces répertoires avec rmdir \\?\C:\path\... depuis Cmd (je n'ai pas encore testé avec PowerShell).

Divers gestionnaires de fichiers, archiveurs, etc. peuvent utiliser l'option \\?\ afin de pouvoir utiliser des noms de chemin plus longs que d'habitude - et ce faisant, ils ne sont pas non plus affectés par le code de compatibilité de Win32 ; ils contournent la suppression des points, ainsi que la traduction des noms de fichiers magiques comme CON o NUL .

Donc ça pourrait être un de vos programmes :

  1. utilise toujours \\?\ pour accéder aux fichiers,
  2. a accidentellement essayé de créer un dossier nommé .... - mais il n'est pas vraiment possible d'en être sûr après coup.

0 votes

Une autre façon de créer des fichiers/dossiers avec des noms "MAUVAIS" est de passer d'une machine Linux ou Mac à un partage de fichiers hébergé sur la machine Windows.

14 votes

Une autre façon de créer un tel dossier est d'utiliser des flux de données alternatifs. Sur l'écran cmd : echo "" > ....::$INDEX_ALLOCATION . Cela créera un dossier nommé .... (qui pointe toujours vers le dossier actuel).

0 votes

Intéressant, maintenant quelqu'un doit juste mettre cela en place dans une VM Windows 98

21voto

user1532080 Points 506

En plus de la réponse de @grawity, un programme Win32 peut également le faire en appelant directement l'API "native". Si je ne me trompe pas, dans le cas présent, il s'agirait de NtCreateDirectoryObject. Ces appels sont assez bien documentés de nos jours, en particulier leur homologue du noyau (que vous ne pouvez pas appeler depuis un programme Win32), dans ce cas, ZwCreateDirectoryObject .

En ce qui concerne la "profondeur infinie", un moyen facile d'y parvenir est d'utiliser des liens. Créez un répertoire, puis à l'intérieur de celui-ci, créez une jonction vers celui-ci (vous pouvez utiliser la fonction mklink /j par exemple), et vous vous retrouverez avec une structure très profonde. La dernière fois que j'ai fait cela, c'était sous Windows 2000, il y avait une limite à la récursion (vous ne pouviez pas "creuser à l'infini"). Il est possible que sur les nouveaux systèmes d'exploitation, la limite soit plus grande ou supprimée. Vous pourriez également créer, disons, 10 répertoires, chacun étant un enfant du précédent, et dans le 10ème, créer un lien vers le premier.

4 votes

C'est très probablement du génie maléfique juste là...

1 votes

J'ai copié des répertoires complets de la même manière pour remplir artificiellement le disque pour des tests, en étant capable de déterminer quand il était proche d'une limite fixée.

0 votes

Il est également possible de le reproduire en utilisant la fonction mkdir ....

18voto

Larryc Points 994

Il existe un moyen plus simple de créer le répertoire. À partir de l'invite de commande, tapez :

MD ....\

et appuyez sur entrée, cela créera un répertoire avec quatre points. Ce répertoire est également consultable avec l'explorateur.

Il existe une faille dans MS-DOS qui remonte à la version 1.0. MS le sait depuis un certain temps mais n'a pas pu ou voulu le corriger. Ils ont corrigé le problème avec PowerShell.

BTW, si vous essayez :

RD ....

La suppression échouera. Vous devez utiliser cette syntaxe spécifique pour le supprimer.

RD ....\

Je l'utilise sur certains serveurs que j'administre. Je crée souvent un dossier utilisateur à la racine du disque et je ne veux pas qu'un autre administrateur vienne le supprimer.

Je vais donc aller dans mon dossier et créer un sous-dossier nommé CON, AUX, ou LPT, etc...

Si un autre administrateur veut supprimer mon dossier, il doit d'abord savoir comment supprimer ce sous-dossier.

EDIT : J'ai réfléchi à cette discussion ce matin et j'ai décidé d'aller un peu plus loin. Je suppose que les mods décideront si cela est pertinent.

Je ne parviens pas à accéder au dossier par CD.

Considérez, si je MD c : \test alors CD C:\test et MD ....\ Je me retrouve avec C:\test....

et tout va bien.

Mais le CD .... échoue et me renvoie vers C:\test. (CD ....\ fait de même.)

Cependant, je peux DIR .... et obtenir une liste de répertoires. Je peux également

MD C:\test....\temp et il crée ce sous-répertoire dans ....

Je peux aussi faire des CD C:\test....\temp et allez dans ce sous-sous-répertoire.

Mais alors que dans C:\test....\temp Si je CD Je suis de retour dans C:\test.

Je ne peux pas accéder à ce répertoire, mais je peux manipuler le dossier en créant des sous-dossiers, et il est intéressant de constater que quelque chose comme

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

fonctionne également et crée un fichier dans ce dossier. Je peux donc créer un dossier avec quatre points, je peux y ajouter des fichiers et des dossiers, je peux en obtenir des listes de répertoires, mais je ne peux pas y accéder par CD. Pourrait-il y avoir une sorte d'utilisation de génie maléfique pour cela ? Je présente mes excuses aux modérateurs si je me suis trop éloigné du sujet.

6 votes

Cela ressemble plutôt à un défaut de l'API Win32, étant donné que l'invite de commande n'est plus "MS-DOS" depuis une vingtaine d'années maintenant.

2 votes

Fait intéressant, si j'essaie de supprimer le répertoire dans l'explorateur Windows, il se bloque alors que je l'ai créé avec votre version. Lorsque je l'ai créé avec cygwin, il échoue simplement et le dit.

0 votes

J'ai une machine DOS 3.3 et une machine DOS 6.0 et les commandes fonctionnent sur ces machines. Quand ils sont passés en 32 bits, le problème était toujours là. Cela fonctionne dans la fenêtre CMD depuis win95 jusqu'à aujourd'hui, y compris toutes les versions du serveur. Maintenant que nous passons à Powershell, cela ne fonctionne plus. Je me suis rendu compte après avoir écrit cela qu'il crée bien le répertoire mais qu'il ne fournit pas l'effet que l'OP voyait. Si j'essaie d'entrer dans le répertoire avec quatre points, je suis renvoyé.

0voto

gru Points 101

Je viens de faire l'expérience d'un tel répertoire récursif nommé .... avec quatre points également. Dans mon cas, j'ai copié des données d'un NAS Synology vers un SSD NVMe M.2 externe.

D'une manière ou d'une autre, je me suis retrouvé avec ce répertoire récursif, qui causait des problèmes lors de la copie de données sur d'autres disques (Windows 10 n'était même pas capable de définir la taille totale des éléments - apparemment, il visitait récursivement tous les éléments des répertoires).

Comme mentionné dans la réponse acceptée, j'ai pu me débarrasser du répertoire récursif en utilisant cette commande (dans l'invite de commande) :

rmdir \\?\E:\parent\....

Dans ce cas, le répertoire récursif .... existait comme enfant direct d'un répertoire nommé parent .

-1voto

Mateusz Points 11

J'ai eu le même problème. Dans mon cas, il s'agissait d'une erreur de frappe dans la commande de publication de .NET Core :

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

Il a créé un répertoire portant le nom "....", que je ne pouvais ni supprimer ni renommer. Ce répertoire a agi comme une référence au répertoire parent. Si j'entre dans ce dossier, je suis toujours dans le dossier parent, mais le chemin d'accès est complété par "....".

J'ai essayé toutes les commandes mentionnées dans ce sujet, mais aucune d'entre elles n'a fonctionné. D'après ce que j'ai compris, cela s'est passé ainsi parce que j'avais d'autres fichiers et répertoires dans le répertoire parent, et j'ai donc dû utiliser des paramètres qui peuvent supprimer récursivement tout le contenu.

J'ai découvert, que cette commande :

rmdir /s /q ....\

peut supprimer le répertoire '....'. Elle ne supprime que la référence au répertoire parent, qui est en fait le répertoire '....', rien de plus, rien de moins. Malgré les arguments de la commande :

  • /s - supprime tout le contenu du répertoire supprimé,
  • /q - supprime sans confirmation,

le répertoire parent est resté intact.

0 votes

Pouvez-vous préciser pourquoi la deuxième commande a fonctionné pour vous ?

0 votes

Vote négatif parce que vous n'avez pas expliqué pourquoi la commande fonctionne ou ce qu'elle fait, comme supprimer le répertoire, les sous-répertoires et les fichiers.

0 votes

Cette opération supprime effectivement le répertoire portant le nom de "....". Elle ne supprime que la référence au répertoire parent, qui est en fait le répertoire '....', rien de plus, rien de moins. J'ai essayé toutes les commandes mentionnées dans ce sujet, mais aucune d'entre elles ne fonctionne. D'après ce que j'ai compris, cette commande a fonctionné parce que j'avais d'autres fichiers et répertoires dans le répertoire parent, et j'ai donc dû utiliser des paramètres qui peuvent supprimer récursivement tout le contenu. Malgré les arguments de la commande, le répertoire parent n'a pas été touché.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X