共有フォルダー上のシンボリックリンクを参照できない

SERVER


共有フォルダー上でリンクを使用する

Windows Vista や Windows Server 2008 には "mklink" というコマンドがあります。これを利用することで、Linux のシンボリックリンクのように、あるフォルダーへのリンクを作成することができるようになっています。

ちなみに、これを利用してシンボリックリンク "link" を作成する場合には、次のようなコマンドを実行することになります。

mklink /D link C:\Temp

上記のように "/D" を付けた場合はフォルダーに対するシンボリックリンクの作成となります。ファイルに対してシンボリックリンクを作成したい場合には、次のようにオプションなしで作成します。

mklink link\a.txt C:\Temp\a.txt

 

これを利用して別のフォルダーへのシンボリックリンクが保存されたフォルダーを作成していたのですけど、それを共有フォルダーとして公開させてみたところ、ネットワーク経由からそのシンボリックリンクへアクセスしてみると、次のようなエラーが発生してしまいました。

\\ServerA\Common\link にアクセスできません。このネットワーク リソースを使用するアクセス許可がない可能性があります。アクセス許可があるかどうかこのサーバーの管理者に問い合わせてください。

シンボリック リンクの種類が無効なため、リンク先に接続できません。

このエラーは、リンク元やリンク先のフォルダーに適切なアクセス権が設定されていないというわけではなく、シンボリックリンクを共有フォルダーを使って参照しようとしているところに原因があるようでした。

どうやら、共有フォルダー経由で利用可能なリンクを作成するには、次のように "ジャンクション" として、それを作成する必要があるようでした。

mklink /J link C:\Temp

このようにすることで、"シンボリックリンク" ではなく "ジャンクション" として、リンクが作成されるようになります。表向きの機能としてはどちらも同じように、リンク元(上記の例では "link")からリンク先(上記の例では "C:\Temp")へのリンクとして機能します。

ジャンクションとしてリンクを作成しておくと、それが共有フォルダー上にあったとしても、正しくその先を参照することができるようになります。

 

ちなみに "ジャンクション" としてリンクを作成する場合は、リンク先を共有フォルダーにすることはできません。

逆に言うと "シンボリックリンク" であれば、別のパソコンの共有フォルダーをあたかもローカルフォルダーのようにリンクすることができるので、そういった観点から、"ジャンクション" を使用するか "シンボリックリンク" を使用するかを判断すると良いかもしれません。

なお、余談になりますけど "ジャンクション" で共有フォルダーへリンクをはると、それを開こうとしたときに、Windows 7 では次のエラーメッセージが表示されるようでした。

C:\link にアクセスできません。

再解析ポイント バッファーにあるデータは無効です。

他にも、リンクの際には "mountvol" コマンドで確認できる "\\?\Volume{90cd4445-f3d2-11df-9588-00241d2eb867}\" というような、ドライブ固有の GUID によるリンク指定もできるので、USB メモリーなどのドライブレターが変わるフォルダーへのリンクを作成することもできます。

この GUID によるリンクは、シンボリックリンクでもジャンクションでも、どちらでも利用できるようになっていました。

 

他のリンクタイプとして /H で作成できる "ハードリンク" というものもありますが、これはこれまでのリンクとは表向きは同じですけど、内部的には少し性質が違って、リンクというよりは 1 つの実体を複数のフォルダーに配置するような感じになるようです。

ハードリンクならどれも "実体" として扱われるため、最後の 1 つが削除されるまでは、最後までそのファイルを参照することが可能です。逆にシンボリックリンクでは、リンク先のファイルが削除されてしまうと、実体が削除されてしまうため、それを参照しているシンボリックリンクは開けなくなります。