私のWindowsマシンには、ある種のウサギの穴のように振る舞う4つのドットの名前のフォルダーがありました。それはどうして起こりましたか?


198

フォルダー名はファイルエクスプローラーに4つのドットだけでリストされていました....

開こうとすると、ある種の無限のウサギの穴のループに入って、まったく同じフォルダーを何度も何度も開きました。これを無限に行うことができました。C:\ExamplePath\....\....\....\....\....などのパスを表示する

1つの特定のプロジェクトでTypeScriptコンパイルがハングしていました。ネストされたフォルダーに深く根付いているため、このフォルダーとそれに関連する問題を見つけるまでに1年以上かかりました。私はこのような問題を予想していなかったので、探したことがありません。

特別な名前のため、通常の方法ではフォルダを削除できませんでした。最後に、コマンドラインを使用し、で親フォルダーを削除することで削除できますrd /s /q path

その後、フォルダーを再度作成しようとしましたが、ファイルエクスプローラーとコマンドラインの両方で作成できませんでした。

私の20年以上のWindowsの使用では、このバグを見たことがないので、アマチュアユーザーにとっては本当に迷惑で混乱した問題になると想像できます。

誰もこれがどのように起こったのか、この問題を再現する方法を知っていますか?

更新

興味のある人向け:このパスはTFSフォルダー内の深い場所にありました。そのため、おそらくTFSは@grawityが説明するバイパスメソッドを使用します「さまざまなファイルマネージャー、アーカイバなど」

まれなTFSのバグに遭遇しましたか?


5
以下の回答では、何が起こっているのか、それを意図的に再現する方法、それを修正する方法について詳しく説明していますが、なぜ起こったかは言及していません。以来..「フォルダを1つ上がる」を示すために、パスで使用することができ、私はどこかのラインに沿って、いくつかのプログラムまたはスクリプトがパスを作成するために、2つの文字列を連結し、1がで終了したことを推測ハザードう..、そして次が始まったと..し、以下で説明する手法のいずれかを使用したため、パス間のフォルダーセパレーターが欠落していても、パスの作成に成功しました。
3D1T0R

6
名前にスペースのみを含むフォルダを作成すると、奇妙なことが起こります
-phuclv

7
このサーバーはインターネット上にありますか?警告するために、私は定期的にインターネットに接続しているWebサーバーが次のリクエストを行うハッキングを確認していますGET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini。明らかに、これを悪用しようとする脆弱性がどこかにあります。
アンディブラウン

4
@AndyBrownはそうで..はなく、そう....です。これ\winntは、開始点の深さが9レベル未満である限り、開始点(Webルート)の深さに関係なく単に移動する方法です。..ルートディレクトリから移動すると、ルートディレクトリに移動するという事実に依存しています。
ホッブズ

5
@hobbsこれは、LinuxのApacheアクセスログからのコピーアンドペーストです。間違いなく4つのドットがあります。ログインして、他のハックの試みがありません使用..、私はこの1つはかなり奇妙た理由でした。
アンディブラウン

回答:


303

Win32では、名前が末尾にあるファイルまたはフォルダーを作成できません.。すべてのドットは末尾から削除されます。作成しようとしtest.ますが、test代わりに表示されます。(これは、古いDOS / Win9x時代のソフトウェアの8.3名との互換性のためです。)

その結果、という名前のフォルダーにアクセスしようとすると....、その名前は空の文字列に縮小され、以前のフォルダーに戻ります。

ただし、NTカーネルはそのような名前を許可します。Win32 APIによって課されるファイル名の制限を回避するさまざまなメカニズムがあります。たとえば、WSL(Linux用のWindowsサブシステム)はWin32上で実行されず、影響を受けません。また、\\?\バイパス方法もあります。これは、プログラムが何をしているのかを知っているプログラムに意図的な「バックドア」を残します。あなたが作成することはできませんにもかかわらずC:\Example\....\、あなたはすることができます作成\\?\C:\Example\....\だけで罰金。

同様にrmdir \\?\C:\path\...、Cmdからそのようなディレクトリを削除できます(私はまだPowerShellでテストしていません)。

さまざまなファイルマネージャ、アーカイバなどが\\?\、通常より長いパス名を使用できるようにするためにメソッドを使用する場合があります。そうすることで、Win32内の互換性コードの影響も受けません。ドットストリッピングと、CONまたはなどのマジックファイル名の変換をバイパスしますNUL

だから、あなたのプログラムの1つかもしれません:

  1. 常に\\?\ファイルへのアクセスに使用し、
  2. という名前のフォルダーを誤って作成しようとしました....が、事実を知ってからそれを確認することは実際には不可能です。

13
このようなフォルダを作成する別の方法は、代替データストリームを使用することです。cmd:でecho "" > ....::$INDEX_ALLOCATION。これにより、....(現在のフォルダーを指す)という名前のフォルダーが作成されます。
-WorldSEnder

2
@DirkBoer私はこれが見つかりました:docs.microsoft.com/en-us/dotnet/standard/io/...
user31389

124
Microsoftはこれを「拡張パスプレフィックス」と呼び、そのプレフィックスを持つパスは「拡張パス」と呼ばれます。(面白い:\\?\".NET 参照ソースで検索すると、サーバーでランタイムエラーが発生します)。
dlatikay

2
@grawityだから。。。このフォルダを今すぐ削除するにはどうすればよいですか?
Shadow503

21
クライアントがWindowsマシンでアカウントを作成したときはいつでもうまく動作するが、彼がログイン/再起動すると彼のアカウントに入れられず、代わりにセッション。地元のPC修理店は困惑していました(彼はまだ起訴されています)。彼の実際の名前は、コン&彼はいつも私はちょうどより多くがあった学んだその日に.....自分のWindowsアカウントの彼の名前を使用しているが判明com1魔法ファイル名としては
RozzA

23

@grawityの答えに加えて、Win32プログラムは「ネイティブ」APIを直接呼び出すことでこれを行うこともできます。間違っていなければ、この場合、それはNtCreateDirectoryObjectになります。これらの呼び出しは、今日ではかなりよく文書化されています。特に、カーネルの対応部分(Win32プログラムから呼び出すことはできません)、この場合はZwCreateDirectoryObjectです。

「無限の深さ」に関して、これを達成する簡単な方法はリンクを使用することです。ディレクトリを作成し、その中にディレクトリへのジャンクションを作成します(mklink /jたとえば、使用できます)。すると、非常に深い構造になります。前回Windows 2000でこれを行ったとき、再帰が終了しました(「無限に掘る」ことはできませんでした)。おそらく新しいOSでは制限が大きくなるか削除されます。また、それぞれが前のディレクトリの子である10個のディレクトリを作成し、10番目のディレクトリで最初のディレクトリへのリンクを作成できます。


4
それは...すぐそこに非常に可能性の悪の天才材料だ
阿木Hammerthief

1
これと同様に完全なディレクトリをコピーして、設定された制限に近づいたかどうかを判断できるようにテスト用にディスクを人為的に埋めました。
mickeyf

cygwinを使用して再現することも可能ですmkdir ....
-lucidbrot

18

ディレクトリを作成する簡単な方法があります。コマンドプロンプトから次を入力します。

MD ....\

Enterキーを押すと、4つのドットでディレクトリが作成されます。このディレクトリは、エクスプローラーでも表示できます。

MS-DOSにはバージョン1.0にまでさかのぼる欠陥があります。MSはしばらくの間それについて知っていましたが、修正できなかったか、修正しませんでした。PowerShellの問題を修正しました。

ところで、あなたがしようとした場合:

RD ....

削除に失敗します。この特定の構文を使用して削除する必要があります。

RD ....\

管理している特定のサーバーでこれを使用します。ディスクのルートにユーザーフォルダーを作成することがよくありますが、別の管理者が来て削除することは望ましくありません。

そのため、フォルダー内に移動して、CON、AUX、またはLPTなどの名前のサブフォルダーを作成します。

別の管理者が私のフォルダを削除したい場合、最初にこのサブフォルダを削除する方法を知る必要があります。

編集:私は今朝この議論について考えていたので、これをさらに一歩進めることにしました。これが関連するかどうかは、MODが決定すると思います。

フォルダーにCDを挿入できません。

私がc:\ testの場合、CD C:\ testおよびMD .... \の場合、C:\ test ....になります。

そしてすべてが順調です。

しかし、CD ....が失敗し、C:\ testに戻ります。(CD .... \は同じことをします。)

しかし、私はDIR ....とdirリストを取得することができます。私がすることもできます

MD C:\ test .... \ tempとすると、そのサブディレクトリが....に作成されます。

CD C:\ test .... \ tempをCDにして、そのサブサブディレクトリに移動することもできます。

しかし、C:\ test .... \ tempにいる間に、CDの場合..私はC:\ testに戻ります。

そのディレクトリにcdすることはできませんが、サブフォルダーを作成することでフォルダーを操作できます。

ECHO "テスト" >> C:\ test .... \ test.txt

動作し、そのフォルダーにファイルを作成します。したがって、4つのドットでフォルダーを作成し、そこにファイルとフォルダーを追加し、ディレクトリの一覧を取得できますが、CDに入れることはできません。これには何らかの悪の天才の使用があるのでしょうか?コースから外れすぎた場合、MODに謝罪します。


6
これは、コマンドプロンプトが約20年もの間 "MS-DOS"でなくなったことを考えると、むしろWin32 APIの欠陥のように聞こえます。
-grawity

2
興味深いことに、Windowsエクスプローラーでディレクトリを削除しようとすると、バージョンで作成したときにクラッシュします。cygwinで作成したとき、単に失敗し、そう言います。
明id

DOS 3.3とDOS 6.0のマシンがあり、それらでコマンドが動作します。彼らが32ビットに切り替えたとき、問題はまだそこにありました。すべてのサーバーバージョンを含め、win95から今日までのCMDウィンドウで機能します。Powershellに切り替えると、動作しなくなります。ディレクトリを作成するが、OPが見ている効果を提供しないことを書いた後に気づきました。4つのドットでディレクトリにCDを書き込もうとすると、追い出されます。
ラリーク

私のWindows 7マシンではMD ....` only creates .... \ .... `ツリー-再帰のステップは1つだけです。
トマーシュZato

不思議なことに、FARマネージャーはこれを特別なものとは見なさず、「たくさんのドット」という名前のディレクトリの内容を作成/名前変更/削除/一覧表示します。
RomanSt

-1

同じ問題がありました。私の場合、それは.NET Coreパブリッシュのコマンドのタイプミスでした:

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

「....」という名前のディレクトリが作成されましたが、削除または名前の変更はできませんでした。このディレクトリは、親ディレクトリへの参照のように機能しました。そのフォルダ内に移動すると、まだ親フォルダにいましたが、パスには「.... \」が追加されました。

このトピックに記載されているすべてのコマンドを試しましたが、どれも機能しませんでした。私の理解では、親ディレクトリに他のファイルとディレクトリがあったため、そのように動作し、すべてのコンテンツを再帰的に削除できるパラメーターを使用する必要がありました。

私はこのコマンドを見つけました:

rmdir /s /q ....\

「....」ディレクトリを削除できます。親ディレクトリへの参照を削除するだけです。この「....」ディレクトリは、実際にはそれ以上でもそれ以下でもありません。コマンド引数にもかかわらず:

  • / s-削除されたディレクトリ内のすべてのコンテンツを削除します。
  • / q-確認なしで削除します。

親ディレクトリは変更されませんでした。


2番目のコマンドがなぜ機能したのかを明確にできますか?
ブルギ

ディレクトリ、サブディレクトリ、ファイルを削除するなど、コマンドが機能する理由や機能について説明しなかったため、投票しません。
冬のフォーク

これにより、実際には「....」という名前のディレクトリが削除されます。親ディレクトリへの参照を削除するだけです。この「....」ディレクトリは、実際にはそれ以上でもそれ以下でもありません。このトピックで説明したコマンドをすべて試しましたが、どれも機能しません。私の理解では、親ディレクトリに他のファイルとディレクトリがあるため、このコマンドは機能しました。したがって、すべてのコンテンツを再帰的に削除できるパラメーターを使用する必要がありました。コマンド引数にもかかわらず、親ディレクトリは変更されませんでした。
マテウス

何とかVisual Studioでこのまったく同じ状況に陥り、何が起こっているのかを理解しようとして何時間もフラストレーションを感じた後、このコマンドでベーコンを節約できました。
NPNelson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.