私はNTFSリンク( 1 、 2 )について学び、コンピューター上でそれらをいじっています。ファイル名とフォルダ名の仮名の奇妙な世界であり、なぜそれらを持っているのかはまだはっきりしていませんが、確かなのは私がそれらをたくさん持っているということです。
NTFSリンクは ハードリンク または 再解析ポイント のいずれかであり、再解析ポイントはジャンクションポイントまたはシンボリックリンクのいずれかです。
それらに精通するために、私は自分のコンピューター上のすべてのNTFSリンクの完全なリストを生成しようとしています。
これは、OSがC:に、データがD:にあるデュアルドライブコンピューターです。 OSはWindows10 Pro 64 v 1903です(v 1909への更新前にログに記録された結果についてここで報告します)。 PowerShellはデフォルトのWindowsv5.1です。
以下では、「ディレクトリ」と「フォルダ」という用語は同義語です。
すべてのリンク
PowerShellには、v 5.0以降、「item」コマンドレットの2つのドキュメント化されていないプロパティがあります。LinkType
とtarget
( 1 、 2 、- 、 4 )。 LinkType
値があります "Junction"、 "SymbolicLink"、および "HardLink"。したがって、これでコンピュータ上のすべてのNTFSリンクを一覧表示できるはずです。ただし、確実に機能するわけではありません。特に、それは 「Users」フォルダ内の特定のオブジェクトで失敗します 。たとえば、PowerShellでは次のようになります。
PS C:\WINDOWS\system32> echo ("1. " + ("C:\Documents and Settings" | get-item -force).LinkType)
echo ("2. " + ("C:\Program Files\Microsoft Office\root\Client\AppvIsvSubsystems32.dll" | get-item -force).LinkType)
echo ("3. " + ("C:\Program Files\NVIDIA Corporation\NvTelemetry\plugins\NvTelemetry" | get-item -force).LinkType)
echo ("4. " + ("C:\ProgramData\Desktop" | get-item -force).LinkType)
echo ("5. " + ("C:\Users\All Users" | get-item -force).LinkType)
echo ("6. " + ("C:\Users\Default User" | get-item -force).LinkType)
1.
2. SymbolicLink
3. Junction
4.
5.
6.
Windowsコマンドプロンプト(以下を参照)のdir /aL
からの対応する結果は次のとおりです。
1. JUNCTION
2. SYMLINK
3. JUNCTION
4. JUNCTION
5. SYMLINKD
6. JUNCTION
したがって、少なくともPowerShell 5.1の場合、LinkType
は信頼できないようです。
ポイントの再解析
PowerShellコマンドレットget-ChildItem
では、パラメーターattribute
のプロパティはReparsePoint
です。これにより、再解析ポイントを識別できるようになりますが、ジャンクションポイントとシンボリックリンクは区別されないため、次に説明するdir /aL
ほど有用ではありません。
Windows(PowerShellではなくコマンドプロンプト)コマンドdir /aL /s X:\
すべての再解析ポイントを一覧表示 ディレクトリXで。管理者として実行すると、データドライブには何も見つからず、システムドライブには574が見つかりました。フォルダ「ProgramFiles」(「ProgramFiles(x86)」ではない)と「Users」、および「ProgramData」と「Windows」にいくつかあります。
そのdir
コマンドの出力では、ターゲットはオブジェクト名の後に角括弧で示され、通常はファイルサイズまたは「<DIR>
」が含まれる列に5つの異なる値があります:0(これはおそらくファイルサイズです)、通常の<DIR>
、および3つの新しい値:<JUNCTION>
、<SYMLINK>
、<SYMLINKD>
。私のコンピューターでは、システムドライブのみで、これらの値は、リンクとターゲットオブジェクトの次の頻度と特性で発生しました。
Count Type/Size Link object Target object
11 <JUNCTION> Folder with root Folder with root
36 Folder not found Folder with root
9 Folder not found Folder w/o root
7 Folder not found Folder not found
10 <SYMLINK> dll file dll file
1 <SYMLINKD> Folder w/o root Folder w/o root
488 <DIR> Folder with root None
12 0 exe file None
----
574 Total
この表では、オブジェクトタイプの意味は次のとおりです。(このアイテムリストでは、dir
は、コマンドプロンプト(PowerShellではない)のオブジェクトに対して、パラメーターなしで(具体的には)管理者としてdir
を実行することを意味します。 、/aL
パラメーターなし)。)
dir
は、オブジェクト(ディレクトリ)自体を表す<DIR> .
で始まる、通常のディレクトリリストのようなリストを生成します。dir "C:\Users\Public\Documents"
dir
は、<DIR> .
またはオブジェクト自体の名前で始まらない1つ以上のオブジェクトのリストを生成します。dir "C:\Users\Public\Desktop"
dir
は「ファイルが見つかりません」を生成し、オブジェクトの名前は拡張子が付いたファイル名のようには見えません。 (PowerShellでは、dir
は「...へのアクセスが拒否されました。」)dir "C:\Documents and Settings"
dir
は、オブジェクト自体の名前である1つのアイテムのリストを生成します。dir "C:\Program Files\Microsoft Office\root\Office16\C2R64.dll"
明らかに、<JUNCTION>
はジャンクションポイントを示し、<SYMLINK>
と<SYMLINKD>
はファイルとフォルダーへのシンボリックリンクを示します。しかし、私はここで他の情報について質問があります:
dir /aL
が再解析ポイントであると言っているが、<DIR>
またはゼロファイルサイズとしてマークされており、ターゲットがない500個のオブジェクトは何ですか? <DIR>
オブジェクトはジャンクションポイントまたはシンボリックリンクまたは他のものですか?ゼロサイズのファイルはシンボリックリンクか何か他のものですか?それらがリンクである場合、それらは何にリンクしていますか?<DIR> .
( "Folder w/o root")で始まらないディレクトリリストは何ですか?私はそれを前に見たことがありません。dir
(/aL
なし)によって検出されるのに、他のジャンクションポイントは検出されないのはなぜですか?ハードリンク
ハードリンクのリストを取得するための簡単でネイティブな方法はないようです。これは私がこれまでにこの主題に関して見つけた6つのStackExchangeの答えです:
LinkType
を使用してリンクを取得するPSコマンドがあります。これはハードリンクで機能する可能性があります。FSutil
を使用したハードリンク用のPSスクリプトがあります。FSutil
を使用してハードリンクを取得するためのバッチスクリプトがありますが、それを機能させることに成功しませんでした。LinkType
に関することを繰り返しています。FindLinks
を示唆しています。すべてのメソッドのテストを終了していません。すべてのハードリンクの正しいリストを取得するために、この一連の問い合わせを効果的に追求するための提案はありますか?
概要
LinkType
がすべてのNTFSリンクを正しく報告することを信頼できないという私の発見についてのコメントはありますか?ハードリンクに関して:良いリストを取得するための提案はありますか?
ハードリンクが作成されると、個別のLinkTypeとして表示されることはないと思います。これは、複数の名前(ディレクトリエントリ)が同じファイルオブジェクトを指すようにすることで機能するためです元の名前と同じ方法で) 。
ファイルがhasハードリンクであるかどうかを判断する唯一の方法は、見つけたfsutil
スクリプトのように、その「リンク数」を確認することです。同様に、Linuxでは、POSIX stat()に「nlink」属性があり、ファイルに含まれるリンクの数を示します(これはls -l
に表示される数です)。
ただし、NTFSにはほとんどありません。ほとんどのUnixファイルシステムには、ハードリンクを区別できるものはありませんfromオリジナル。 2つのファイルが同じ「inode」(NTFSと同等)を指しているため、ハードリンクされていることがわかりますが、どちらのリンクが後で追加されたかはわかりません。これは、2つの名前を持つ単なるファイルです。
NTFSリンクはハードリンクまたは再解析ポイントのいずれかであり、再解析ポイントはジャンクションポイントまたはシンボリックリンクのいずれかです
[...]
Dir/aLが再解析ポイントであると言っているが、ファイルサイズがゼロまたはゼロとしてマークされており、ターゲットがない500個のオブジェクトは何ですか?
<DIR>
オブジェクトはジャンクションポイントまたはシンボリックリンクまたは他のものですか?ゼロサイズのファイルはシンボリックリンクか何か他のものですか?それらがリンクである場合、それらは何にリンクしていますか?
すべての再解析ポイントがリンクであるとは限りません。それらにはさまざまなタグを含めることができ、それらの一般的な目的は、ファイルルックアップを特定のドライバーにリダイレクトすることだけです。
たとえば、Windowsでは、ドライブ/ボリュームに「ドライブ文字」を付ける代わりに、空のフォルダ(Unixスタイル)にマウントすることができます。ただし、一時的なUnixマウントポイントとは異なり、Windowsマウントポイントはファイルシステム内で永続的です。これらは、マウントされたボリュームIDを格納する一種の再解析ポイントです。
再解析ポイントのもう1つの非常に一般的な使用法は、OneDriveやDropboxのように「クラウド」または「オンラインのみ」のファイルを実装することです(どちらも実装方法が大きく異なります)。これらは通常のファイルとして表示され、開くとオンラインダウンロードがトリガーされます。 。
特定の方法でインストールされたMicrosoftOfficeを使用している場合(完全にはわかりませんが、私はthink ClickOnceを介してインストールされたOffice365です)、さらに別の種類の再解析ポイントを使用しているようです。これもジャンクションではありません。シンボリックリンクもありません。 fsutil reparsepoint query
を使用して、何か面白いものが見つかるかどうかを確認してください。
フォルダが見つかりません:dirは「ファイルが見つかりません」を生成し、オブジェクトの名前は拡張子が付いたファイル名のようには見えません。 (PowerShellでは、dirは「...へのアクセスが拒否されました」という結果になります。)
例(リンクオブジェクト):
dir "C:\Documents and Settings"
残念ながら、「ファイルが見つかりません」は、セキュリティ制限が原因で発生したエラーをCMDが報告する方法です。これは、空のリストを正常に取得したことを意味するわけではありません。
「ドキュメントと設定」は標準のジャンクションポイントであり、内容の一覧表示を明示的に拒否するACL(icacls
を参照)があります。これは、特定のリンクを知らないプログラムが同じユーザープロファイルディレクトリを2回スキャンすることを回避するために行われたと述べている古いblogs.msdn.comの投稿がありました。