共有フォルダー上のシンボリックリンクを参照できない
SERVER
.style1 {
font-size: 12px;
}
共有フォルダー上でリンクを使用する
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 つが削除されるまでは、最後までそのファイルを参照することが可能です。逆にシンボリックリンクでは、リンク先のファイルが削除されてしまうと、実体が削除されてしまうため、それを参照しているシンボリックリンクは開けなくなります。