『見えないディレクトリ』の謎

カバー

執筆のきっかけ

先日、ExcelのVBA(Visual Basic for Applications)マクロで『指定したディレクトリ配下のファイルの内容を確認する』機能を作成しました。

今回のマクロではFSO(FileSystemObject)を使用し、指定されたディレクトリのサブディレクトリとファイルを取得し、さらにそのサブディレクトリ配下のサブディレクトリとファイル情報を再帰的に取得しています。 (FSOの詳細はプログラミング言語のVBAで説明)

マクロの動作確認で指定ディレクトリを C:\ にしたところ、以下のような予期しない事象が発生しました。

  • C:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\config のサブディレクトリ・ファイル情報を取得する箇所で、「エラーNo.76: パスが見つかりません」 が発生した
  • エラーが発生したC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\config をエクスプローラーで確認したところ、その上位のC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32 もディレクトリの存在を確認できなかった
    (隠しファイルやシステムファイルも表示する設定に変更済) 発生した事象のイメージ

発生した事象に基づき、下記の原因について調査しました。

  • なぜサブディレクトリをたどることができなかったのか?
  • なぜエラーが発生したディレクトリの上位ディレクトリがエクスプローラーで見えなかったのか?

調査の結果、ファイルを管理しているシステム(ファイルシステム)に起因していることがわかったため、ファイルシステムの概要・ファイルシステムで管理している情報の確認方法・発生した事象の分析結果を本記事にまとめました。

ファイルシステムとは

ファイルシステムとは、コンピュータのディスクやSSD、その他のストレージメディア上でファイルやディレクトリを構造的に、また整理された形で保存・管理するためのシステムです。

ファイルシステムはOSの機能です。ファイルシステム規格・仕様の種類はいくつか存在し、その中からOSが認識できるものを採用しています。 また、ファイルシステムの規格を認識するためのデバイスドライバーがあれば、OSが認識できるファイルシステムの種類を拡張することができます。

ファイルシステムとOSの関係

OSごとに採用しているファイルシステムの例とその概要を紹介します。

OSファイルシステムの説明
WindowsNTFSを基本的なファイルシステムとして採用しています。また、FATやexFATなどのファイルシステムをサポートしており、主に互換性を保つためや外部デバイスに利用されています。
Linuxextを基本的なファイルシステムとして採用しています。現在の最新版はext4です。また、多くの異なるファイルシステムに対応しています。
MacOSHFS+を基本的なファイルシステムとして使用してきましたが、近年ではAPFSに移行しています。

ファイルシステムの特性

ファイルシステムは情報(データ)をファイルという概念で構造化して管理しています。 ファイルはデータそのものの他に以下のようなメタ情報を保持しており、これらの情報を用いて管理します。

名称説明
ファイル名システム上でファイルを一意に特定するための名前
ファイルサイズファイルが占めるストレージのサイズ
作成日時ファイルが作成された日時
最終更新日時ファイルが最後に変更された日時
ファイル所有者ファイル所有者情報。通常は所有者に特定の権限が与えられる
アクセス権(パーミッション)ファイルに対する読み取り、書き込み、実行などのアクセス権限
ファイルの物理的な位置ファイルがディスク上のどこに格納されているかを示す情報


代表的なファイルシステムには以下のようなものがあります。

ファイルシステム説明
FAT(File Allocation Table)マイクロソフトによって開発された古いファイルシステム
NTFS(New Technology File System)Windowsのメインファイルシステムとして使用
ext4(Extended Filesystem)Linuxベースのシステム・サーバー・Androidデバイスなどで使用
HFS+(Hierarchical File System Plus)Appleによって開発され、MacOSで長年使用されてきたファイルシステム
APFS(Apple File System)Appleの新しいファイルシステム。現在のMacOS・iOS・iPadOS・tvOSなどで使用

ファイルシステムがサポートしているリンク

ファイルシステムがサポートしているリンク(シンボリックリンク・ハードリンク・ジャンクション)について説明します。

リンク説明
シンボリックリンクあるファイルやディレクトリを本来の位置にファイルを残しつつ、それとは別の場所に置いたり別名を付けてアクセスする。
ハードリンクあるファイルに複数の名前を付け、それぞれが実際のファイル名として同じように操作できる。対象はファイルのみ。
ジャンクションハードリンクとは異なり、ディレクトリのみを対象としている。再解析(リパース)ポイントを通じて実装される。


この3種類のリンクをサポートしているファイルシステムは以下の通りです。

ファイルシステムシンボリックリンクハードリンクジャンクション
FAT×××
NTFS
ext4×
HFS+×
APFS×

ファイルシステムで管理しているディレクトリ・ファイルの確認方法

ファイルシステムで管理しているディレクトリ・ファイル情報をユーザーが確認する方法は複数存在します。

ユーザーがファイルシステムで管理されているすべてのディレクトリ・ファイル情報を確認できるわけではありませんが、ユーザーフレンドリーな操作性を提供するために、GUI・コマンド・APIなどが用意されています。 また、プログラミング言語でこれらのディレクトリ・ファイル情報を操作することができます。

以下で、これらの方法の特徴について説明します。

GUI

Windowsエクスプローラー(以下『エクスプローラー』と表記)

エクスプローラーはWindowsの主要なファイル管理ツールです。 エクスプローラーでは、操作対象として扱う各種のオブジェクト(ファイル・ディレクトリ・デバイス・特殊なディレクトリなど)を、ファイルとディレクトリの形でツリー構造に表現します。 そのため、ユーザーはファイルやディレクトリと同じ感覚でこれらのオブジェクトを操作することができます。

エクスプローラーでは通常、システムファイルや隠しファイルを非表示にする設定となっています。 この設定を変更しても、エクスプローラーはファイルシステムが管理しているすべてのディレクトリ・ファイル情報をユーザーに見せているわけではありません。 そのため、見えないディレクトリ・ファイルが存在することに注意が必要です。

エクスプローラーで確認できる情報には、ファイルシステムで管理しているディレクトリ・ファイルの他にも、デスクトップ・ドキュメント・ダウンロードなどの特殊ディレクトリがあります。 例えばPCツリー表示にあるデスクトップドキュメントなどのディレクトリは、実際にはユーザーディレクトリ内に存在しますが、エクスプローラーではPC直下にも表示されます。 これらのディレクトリの実際のパスは、C:\Users\[ユーザー名] 配下にあり、ドキュメントディレクトリの実際のパスは、C:\Users\[ユーザー名]\Documentsです。 エクスプローラーの表示は、見やすさや使いやすさを優先したレイアウトであるため、実際のディレクトリ構造と異なる場合があります。

そしてエクスプローラーは、シェル名前空間を通じてプリンタ、コントロールパネルなどのシステム設定やネットワークリソースなども管理しています。 また、エクスプローラーにはシェル拡張という機能があり、これによりファイルプレビュー・右クリックメニューのカスタマイズ・画像などのサムネイル作成などが実現されています。

このようにエクスプローラーでは、ディレクトリ・ファイル情報の表示・操作以外にも多くの機能を備えています。

Linux OS GUI

Linux OSでファイルシステムを操作する基本的な方法はコマンドライン(ターミナル)ですが、GUIを備えたディストリビューションでは、エクスプローラーに似たグラフィカルなファイル管理ツールを使用することもできます。 ただし、サーバー用途などでリソースを節約するためにGUIをインストールしない場合もあります。

コマンド

Windows コマンドプロンプト(以降『コマンドプロンプト』と表記)

コマンドプロンプトは、テキストベースのインターフェースを介してユーザーがオペレーティングシステムを操作できるツールです。ディレクトリ・ファイルの移動・削除・コピーなどの操作を行ったり、バッチファイルを使って一連のコマンドを自動的に実行することができます。

コマンドプロンプトを通常のユーザーとして起動した場合、ユーザーが持つ権限範囲内でのみディレクトリ・ファイルにアクセスできます。 管理者権限で起動すると、システム全体にまたがる広範な操作が可能になり、通常ユーザー権限ではアクセス不可能なディレクトリ・ファイルにもアクセス可能になります。

Windows PowerShell(以降『PowerShell』と表記)

コマンドプロンプトがテキストを主とした出力を行うのに対し、PowerShellはオブジェクト指向の設計を持っているため、オブジェクトを主とした出力を提供します。 また、PowerShellもコマンドプロンプトと同様に管理者権限で起動できます。

Linuxコマンド

Linuxはユーザーやアプリケーションがファイルシステムのリソースを自由にかつ詳細に操作できるようにします。 LinuxOSにもGUIは存在しますが、複雑な操作やバッチ処理・自動化を行うには、コマンドラインでの操作が必要となることが多いです。

API

OSから提供されるAPIを用いて、開発者はファイルシステムを扱うことができます。

Windows

Windowsでは、Windows API(またはWinAPI)というWindowsのシステムコール用APIがあります。ディレクトリ・ファイルの操作、ファイルの属性情報の取得、ファイルの読み書きなど、さまざまな操作が可能です。 主なAPIには、CreateFile・ReadFile・WriteFile・CloseHandleなどがあります。

Linux

Linuxでは、POSIX APIが使用されます。open・read・write・closeなどの関数によってファイルの開閉、読み書きが可能であり、mkdir・rmdirなどでディレクトリの作成や削除なども可能です。

MacOS

MacOSも基本的にはLinuxと同じくPOSIX APIを使用します。

プログラミング言語

プログラミング言語では、OSが提供するAPIを直接使用することは少なく、標準ライブラリやフレームワークを通じて、これらのファイルシステムAPIを扱うことが一般的です。

VBA

FSO(FileSystemObject)を使用します。 FSOはマイクロソフトが提供する、スクリプトからディレクトリ・ファイル情報を操作するためのオブジェクトで、ディレクトリ・ファイルの生成・削除・移動・情報取得などの基本的な操作を行うことができます。

FSOはエクスプローラーの表示設定には影響されず、ディレクトリ・ファイルにアクセスできます。 例えばエクスプローラーでデフォルト非表示になっているシステムファイルや隠しファイルも取得します。

リンク情報についても扱いに差分があります。 エクスプローラーやコマンドプロンプトではリンク情報を認識できますが、FSOではリンク情報を判断できません。

例えばNTFSのリンクにはシンボリックリンク・ハードリンク・ジャンクションの3種類があります。このうち、同一のコンピュータ上のディレクトリに対してリンクを作成できるジャンクションを使用して、リンク情報の見え方を確認します。

以下のようなジャンクションを設定します。

  • リンク元(dataをC:\data\test\data\it_testにリンク)
C:\sample\test\data
  • リンク先
C:\data\test\data\it_test
         └test01.json

コマンドプロンプトで mklink /j [リンク元] [リンク先パス] を実行し、ジャンクションを設定します。

ジャンクション設定

dirコマンドでdataディレクトリに <JUNCTION> が設定されていることを確認できます。

ジャンクション確認(コマンドプロンプト)

dir dataコマンドでdataディレクトリ内のリンク先であるtest01.jsonを確認できます。

ジャンクション確認(コマンドプロンプト)

エクスプローラーでは、アイコンにリンクが表示されます。ただしジャンクションのリンク情報はプロパティで確認できません。

ジャンクション確認(エクスプローラー)

シンボリックリンクが設定されている場合は、コマンドプロンプトやエクスプローラーでリンクが表示されます。 エクスプローラーのプロパティではショートカットタブが表示され、リンク先の情報を確認できます。

シンボリックリンク確認(コマンドプロンプト)

シンボリックリンク確認(エクスプローラー)

以上のように、コマンドプロンプトやエクスプローラーではリンクを確認する手段がありますが、FSOではリンク情報を判断できません。そのため、実体はC:\data\test\data\it_testにあるtest01.jsonを、FSOでC:\sample\test\dataからたどってファイル情報を取得すると、そこに含まれるパスはC:\sample\test\data\test01.jsonとなっています。

Python

Pythonの標準ライブラリを使って、ファイルの読み書きやディレクトリの操作が可能です。

Java

Javaではjava.ioパッケージまたはjava.nio.fileパッケージを使用して、ファイルの読み書きやディレクトリの操作をします。

JavaScript (Node.js)

JavaScriptでは、Node.jsの実行環境を使用し、その中で提供されるfsモジュールを利用することでディレクトリ・ファイルの操作が可能です。

分析

これまで調査した内容から、冒頭の事象を改めて分析します。

1. 事象

ExcelのVBAマクロで指定したディレクトリ配下のファイルの内容を確認する機能を作成しました。 今回のマクロではFSO(FileSystemObject)を使用し、指定されたディレクトリのサブディレクトリとファイルを取得し、さらにそのサブディレクトリ配下のサブディレクトリとファイル情報を再帰的に取得しています。

マクロの動作確認で指定ディレクトリを C:\ にしたところ、以下のような予期しない事象が発生しました。

  • C:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\config のサブディレクトリ・ファイル情報を取得する箇所で、「エラーNo.76: パスが見つかりません」 が発生した
  • エラーが発生したC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\config をエクスプローラーで確認したところ、その上位のC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32 もディレクトリの存在を確認できなかった
    (隠しファイルやシステムファイルも表示する設定に変更済)

発生した事象のイメージ

2. 疑問

【疑問1】なぜサブディレクトリをたどることができなかったのか?

【疑問2】なぜエラーが発生したディレクトリの上位ディレクトリがエクスプローラーで見えなかったのか?

3. 解析

3.1 リンク設定の仮説

対象のパスC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\configWindows\System32が含まれていることから、WindowsのNTFSの機能の一部であるリンクがC:\Windows\System32に設定されていると仮説を立てました。

  • リンク元:C:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32
  • リンク先:C:\Windows\System32

3.2 仮説の確認①

エクスプローラーでリンク先と思われるC:\Windows\System32に、今回エラーが発生したディレクトリと同名のconfigディレクトリが存在していることを確認しました。

System32表示確認

Windows\System32がリンクされているという仮説が強まったため、さらにその上位のWindowsディレクトリに注目し分析を続けます。

そこで、エクスプローラーが構成情報をたどるときに使用しているCOMオブジェクト(Shell32)を利用し、簡易エクスプローラーを用意しました。

簡易エクスプローラー説明

C:\Program Files (x86)\Microsoft Office\root\vfs\WindowsC:\Windows配下のディレクトリ構成はSystem32を含めて同じ構成であることを確認しました。

簡易エクスプローラー

次に、コマンドプロンプトのdirコマンドで構成情報をたどるときに使用しているFileAPIを利用し、簡易エクスプローラー(FileAPI)を用意しました。 こちらでも2つのディレクトリが同じ構成を持っていることを確認しました。 簡易エクスプローラー(FileAPI)説明 簡易エクスプローラー(FileAPI)

続いて、エクスプローラーでC:\Program Files (x86)\Microsoft Office\root\vfs\Windows 配下に表示されている他のディレクトリについても詳細に確認しました。エクスプローラーで表示されているディレクトリに差分はありましたが、簡易エクスプローラーで確認したところ、該当のディレクトリを双方に確認できました。

表示ディレクトリの差分確認(エクスプローラー)

表示ディレクトリの差分確認(簡易エクスプローラー)

さらにリンクしていることを確認するため、片方に新規ディレクトリを追加し、もう片方に追加したディレクトリが表示されるかを双方向から検証します。

まずは、C:\Windowsに新規ディレクトリ0_Dummyを追加し、C:\Program Files (x86)\Microsoft Office\root\vfs\Windows配下から確認できるかを検証しました。するとエクスプローラーでは追加ディレクトリを確認することはできませんでしたが、簡易エクスプローラーでは確認することができました。

ディレクトリ追加時の確認1

今度はC:\Program Files (x86)\Microsoft Office\root\vfs\Windowsに新規ディレクトリ1_Dummyを追加したところ、同じ状態になりました。

ディレクトリ追加時の確認2

これまでの2つのディレクトリの表示関係をまとめると以下の通りです。

検証C:\WindowsC:\Program Files (x86)\Microsoft Office\root\vfs\Windows
Windowsの表示確認122項目表示5項目表示
Windows\System32の表示確認表示される(System32\configも確認)表示されない
Windows\assembly\GAC_32、Windows\Installer配下の表示確認表示されるC:\Windowsには表示されていないディレクトリを表示
Windows\PCHEALTH、Windows\SHELLNEWの表示確認表示されない表示される
C:\Windowsに新規ディレクトリ追加表示される表示されない
C:\Program Files (x86)\Microsoft Office\root\vfs\Windowsに新規ディレクトリ追加表示されない表示される

次にアクセス権について確認しました。 Windowsではicaclsコマンドでアクセス制御リストを出力できます。
2つのディレクトリに対して異なるアクセス権が設定されているか確認しました。

Windowsディレクトリに対する実行コマンド結果はC:\Program Files (x86)\Microsoft Office\root\vfs\Windowsに上位からの継承を示す(I)があるものの、他には大きな差分は見られませんでした。

  • icacls "C:\Program Files (x86)\Microsoft Office\root\vfs\Windows"
NT AUTHORITY\SYSTEM:(I)(F)
NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F)
NT SERVICE\TrustedInstaller:(I)(F)
NT SERVICE\TrustedInstaller:(I)(CI)(IO)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Administrators:(I)(OI)(CI)(IO)(F)
BUILTIN\Users:(I)(RX)
BUILTIN\Users:(I)(OI)(CI)(IO)(GR,GE)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(OI)(CI)(IO)(GR,GE)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(I)(RX)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(I)(OI)(CI)(IO)(GR,GE)
  • icacls "C:\Windows"
NT AUTHORITY\SYSTEM:(M)
NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(F)
NT SERVICE\TrustedInstaller:(F)
NT SERVICE\TrustedInstaller:(CI)(IO)(F)
BUILTIN\Administrators:(M)
BUILTIN\Administrators:(OI)(CI)(IO)(F)
BUILTIN\Users:(RX)
BUILTIN\Users:(OI)(CI)(IO)(GR,GE)
CREATOR OWNER:(OI)(CI)(IO)(F)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(OI)(CI)(IO)(GR,GE)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(RX)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(OI)(CI)(IO)(GR,GE)

Windows配下のディレクトリのうち、両方ともエクスプローラーで表示を確認できるassemblyInstallerについても同様の確認コマンドを実行しました。

  • icacls "C:\Program Files (x86)\Microsoft Office\root\vfs\Windows\assembly"
NT AUTHORITY\SYSTEM:(I)(F)
NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F)
NT SERVICE\TrustedInstaller:(I)(F)
NT SERVICE\TrustedInstaller:(I)(CI)(IO)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Administrators:(I)(OI)(CI)(IO)(F)
BUILTIN\Users:(I)(RX)
BUILTIN\Users:(I)(OI)(CI)(IO)(GR,GE)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(OI)(CI)(IO)(GR,GE)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(I)(RX)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(I)(OI)(CI)(IO)(GR,GE)
  • icacls "C:\Windows\assembly"
NT AUTHORITY\SYSTEM:(I)(F)
NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Administrators:(I)(OI)(CI)(IO)(F)
BUILTIN\Users:(I)(RX)
BUILTIN\Users:(I)(OI)(CI)(IO)(GR,GE)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(OI)(CI)(IO)(GR,GE)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(I)(RX)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ:(I)(OI)(CI)(IO)(GR,GE)
  • icacls "C:\Program Files (x86)\Microsoft Office\root\vfs\Windows\Installer"
NT AUTHORITY\SYSTEM:(I)(F)
NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F)
NT SERVICE\TrustedInstaller:(I)(F)
NT SERVICE\TrustedInstaller:(I)(CI)(IO)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Administrators:(I)(OI)(CI)(IO)(F)
BUILTIN\Users:(I)(RX)
BUILTIN\Users:(I)(OI)(CI)(IO)(GR,GE)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(OI)(CI)(IO)(GR,GE)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプ リケーション パッケージ:(I)(RX)
APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプ リケーション パッケージ:(I)(OI)(CI)(IO)(GR,GE)
  • icacls "C:\Windows\Installer"
NT AUTHORITY\SYSTEM:(OI)(CI)(F)
Everyone:(OI)(CI)(RX)
BUILTIN\Administrators:(OI)(CI)(F)

Windowsディレクトリにはアクセス権の大きな差はありませんでしたが、配下のディレクトリには設定されているアクセス権に差があることがわかりました。 エクスプローラーに表示されていないディレクトリは、コマンドプロンプトでもエクスプローラーと同様にディレクトリの存在を確認できないため、アクセス権を確認することはできませんでした。

これらの結果から、C:\Program Files (x86)\Microsoft Office\root\vfs\WindowsC:\Windowsファイルシステム上、同じ情報を保持していることは確認できましたが、エクスプローラーにはすべての情報を表示しているわけではないということを確認できました。 そして、今回の事象が発生したC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32エクスプローラーで表示対象外だったと判断しました。⇒【疑問2の原因①】

3.3 ディレクトリのリンク方法の確認

C:\Program Files (x86)\Microsoft Office\root\vfs\WindowsC:\Windowsはファイルシステム上の同じ情報を保持していることは確認できましたが、これらがどのような関係であるのかを確認します。

NTFSにはシンボリックリンク・ハードリンク・ジャンクションのリンクがありますが、今回のディレクトリの関係はいずれに該当するのかdirコマンドで確認します。 ディレクトリに対するリンクはシンボリックリンク・ジャンクションのいずれかになるので、コマンド結果に <SYMLINKD>か<JINCTION> が出力されるはずです。

  • C:\Program Files (x86)\Microsoft Office\root\vfs
C:\Program Files (x86)\Microsoft Office\root\vfs>dir /A
---------- 省略 ----------
2022/06/25 04:19 <DIR> Windows
  • C:\Program Files (x86)\Microsoft Office\root\vfs\Windows
C:\Program Files (x86)\Microsoft Office\root\vfs\Windows>dir /A
---------- 省略 ----------
2022/02/15 10:28 <DIR> assembly
2022/06/25 04:19 <DIR> Installer
2019/08/05 10:10 <DIR> PCHEALTH
2021/01/25 16:14 <DIR> SHELLNEW
  • C:\
C:\>dir /A
---------- 省略 ----------
2024/06/04 15:29 <DIR> Windows
  • C:\Windows
C:\Windows>dir /A
---------- 省略 ----------
2024/04/11 16:45 <DIR> assembly
---------- 省略 ----------
2024/05/27 11:50 <DIR> Installer
---------- 省略 ----------
2024/05/27 14:40 <DIR> System32

今回調査対象のディレクトリは、すべて通常のディレクトリである <DIR> と出力され、シンボリックリンク・ジャンクションには該当しないことがわかりました。

つまり、NTFSのリンク以外にディレクトリ同士をつなげる仕組みが他にもあることがわかります。 ここで注目したのが C:\Program Files (x86)\Microsoft Office\root\vfs\Windowsvfsの部分です。 VFS仮想ファイルシステム(Virtual File System) の略であり、パスの名称からOfficeのプログラムがWindows関連の情報を仮想ファイルシステムとして扱っているのではないかという次の仮説を立てました。

3.4 仮説の確認②

まず、今回エクスプローラーで表示できなかったC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32がOffice(Excelを使用)からどのように見えるのか確認してみたところ、Excelのファイルを開くダイアログでは、C:\Program Files (x86)\Microsoft Office\root\vfs\WindowsSystem32System32\configなど今までエクスプローラーで表示されなかったものを確認することができました。

Excelのファイルを開くダイアログに表示された情報は、エクスプローラー上C:\Program Files (x86)\Microsoft Office\root\vfs\Windowsで表示されていたものと、C:\Windowsで表示されていたものが統合されているようでした。

Excelのファイルを開くダイアログ 表示確認まとめ

[作業ディレクトリとアプリケーション ファイル | Microsoft Learn]によると、Windowsの特定のアプリでは、Windowsの既知のディレクトリ(例:System32、Program Files(x86)など)がアプリのパッケージ内の対応するディレクトリに動的にマージされる仕組みがあることがわかりました。

そのパッケージには、VFSという名前のディレクトリが含まれており、パスはC:\Program Files<パッケージ名>\VFS<既知のディレクトリ> を基準とします。 <既知のディレクトリ> に設定される値は[パッケージ化された VFS の場所 | Microsoft Learn]で確認できます。

今回の場合はMicrosoft Officeで使用するVFSのWindows情報C:\Program Files (x86)\Microsoft Office\root\vfs\WindowsC:\Windowsに動的にマージされていたため、それぞれで同じ構成情報を確認できたということです。

3.5 エクスプローラーでC:\Windows\System32\configのディレクトリ情報を確認

エラーが発生したC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\configのマージ先であるC:\Windows\System32\configのディレクトリ情報をエクスプローラーで表示しようとしたところ、UAC(ユーザーアカウント制御) の許可が必要でした。 そのため、FSOでディレクトリ情報の取得に失敗し、「エラーNo.76: パスが見つかりません」 と出力されたと考えられます。⇒【疑問1の原因】

UAC

3.6 エクスプローラー表示とFSOのディレクトリ・ファイル情報取得の違い

エクスプローラーの表示条件とは関係なく、FSOはファイルシステムからディレクトリ・ファイル情報を取得します。 そのため、エクスプローラーではC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\configのディレクトリが表示されませんでしたが、FSOではファイルシステムから該当ディレクトリの情報を取得して処理をしようとしていました。⇒【疑問2の原因②】

4. 結論

下記条件のために今回の事象が発生したと判断しました。

  • 【疑問1】なぜサブディレクトリをたどることができなかったのか?

    • FSOで処理中のディレクトリC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32\configとVFSでマージしているディレクトリC:\Windows\System32\configが、UACの許可を必要としていたため、FSOでディレクトリ情報の取得に失敗し、「エラーNo.76: パスが見つかりません」 が発生した。
  • 【疑問2】なぜエラーが発生したディレクトリの上位ディレクトリC:\Program Files (x86)\Microsoft Office\root\vfs\Windows\System32 がエクスプローラーで見えなかったのか?

    • C:\Program Files (x86)\Microsoft Office\root\vfs\WindowsC:¥Windowsと動的にマージされるVFSだった。さらに該当パスがエクスプローラーの表示対象外だった。
    • FSOはエクスプローラーの表示条件とは関係なく、ファイルシステムからディレクトリ・ファイル情報を取得するため、この差異がFSOで処理中のディレクトリがエクスプローラーで見えないという事象を引き起こした。

まとめ

これまで私は、PC上のすべてのディレクトリやファイルをエクスプローラーで見ることができ、FSOなどのプログラムとエクスプローラーが同じ情報を提供すると考えていました。しかし、その認識が誤っていたことに気づきました。 今回の調査を通じて、ファイルシステムの存在とその情報を確認する方法、エクスプローラーが単なるビューアーではなく多機能であること、そしてWindowsのVFSの仕組みについて知識を得ました。 ビューアーの種類によって表示する内容に違いがあり、またプログラムで扱うことができる情報にも差があることを理解することができました。


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。