web-dev-qa-db-ja.com

NTFSリンクのリストの取得と理解

私はNTFSリンク( 12 )について学び、コンピューター上でそれらをいじっています。ファイル名とフォルダ名の仮名の奇妙な世界であり、なぜそれらを持っているのかはまだはっきりしていませんが、確かなのは私がそれらをたくさん持っているということです。

NTFSリンクは ハードリンク または 再解析ポイント のいずれかであり、再解析ポイントはジャンクションポイントまたはシンボリックリンクのいずれかです。

それらに精通するために、私は自分のコンピューター上のすべてのNTFSリンクの完全なリストを生成しようとしています。

これは、OSがC:に、データがD:にあるデュアルドライブコンピューターです。 OSはWindows10 Pro 64 v 1903です(v 1909への更新前にログに記録された結果についてここで報告します)。 PowerShellはデフォルトのWindowsv5.1です。

以下では、「ディレクトリ」と「フォルダ」という用語は同義語です。

すべてのリンク

PowerShellには、v 5.0以降、「item」コマンドレットの2つのドキュメント化されていないプロパティがあります。LinkTypetarget12 、- 、 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がすべてのNTFSリンクを正しく報告することを信頼できないという私の発見についてのコメントはありますか?
  • Rereparse point:そのセクションの最後に記載されている3つの質問に対する回答はありますか?
  • Reハードリンク:良いリストを取得するための提案はありますか?
  • ファイルシステムの仮名のこの奇妙な世界について共有する他の知恵や洞察はありますか?
1
NewSites

ハードリンクに関して:良いリストを取得するための提案はありますか?

ハードリンクが作成されると、個別の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の投稿がありました。

1
user1686