UNCパスをローカルドライブ文字にマップできることを知っています。ただし、UNCパスをローカルフォルダーにマップする方法があるかどうか疑問に思っています。プログラムにハードコードされた特定のフォルダーを持つプログラムがあり、UNCパスにマップされている同じ名前のフォルダーを作成して、ネットワーク共有からデータにアクセスできるようにします。これは実行可能ですか?具体的には、これはWindows 2003サーバー上にあります。
これは、OPが要求したものと完全に一致します-ネットワーク共有にマップするWindows 2003のシンボリックリンク。他の人を何時間も見てテストした後、これはネットワーク共有で機能する唯一のコンポーネントです。
このユーティリティは、XPおよび2003でネットワーク共有へのマッピングとシンボリックリンクの作成の両方で機能します。 http://schinagl.priv.at/nt/ln/ln.html# symboliclinksforwindowsxp
これをパスに配置したディレクトリに配置すると、senable.exe
(symlink.sys
を使用)とln.exe
を使用してシンボリックリンクを作成できます(上記のサイトから必要になります) Visual C++ランタイムDLLへの依存関係も含めて)。
これらの追加の2つのファイルをsenable.exe
がある同じディレクトリに配置し、これがすべてパス上にあることを確認します。
@echo off
SET DIR=%~dp0%
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "& '%DIR%Symlink.ps1' %*"
pushd "%DIR%"
"%DIR%senable.exe" start
popd
param (
[string]$symlinktype,
[string]$link,
[string]$target
)
$scriptpath = $MyInvocation.MyCommand.Path
$ScriptDir = Split-Path $scriptpath
$senable = Join-Path "$ScriptDir" senable.exe
$ln = Join-Path "$ScriptDir" ln.exe
pushd "$ScriptDir"
& cmd /c "$senable" install
popd
& cmd /c "$ln" -s "$target" "$link"
Windows 2003に次のアイテムをインストールする必要があります(R2以外、R2に必要なものがまだ完全にはわかりません)。
これをすべて行うチョコレートのパッケージを作成しました: http://chocolatey.org/packages/win2003-mklink
通常のシンボリックリンクとは異なり、シンボリックリンクフォルダーを削除するためにフォルダーを単に削除することはできません。それを行うと、それが指している実際のフォルダが削除されます。したがって、細心の注意を払って使用してください。
はい、UNCパスをローカルフォルダーにマップする方法があります。
C:\>mklink /D Develop \\obsidian\Develop
symbolic link created for Develop <<===>> \\obsidian\Develop
これは、buildサーバーが自分のPCのDevelop
フォルダーをDevelop
フォルダーとして使用するためです。
10/20/2012 11:01 AM <SYMLINKD> Develop [\\obsidian\Develop]
そして、あなたはそれを持っています。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link specifies the new symbolic link name.
Target specifies the path (relative or absolute) that the new link
refers to.
注:実際の状況では、別のレベルのリダイレクトが必要でした。使用しているプログラムは、Develop
がシンボリックリンクであり、リモートマシン、および準拠を拒否しました。 localリソースを指すジャンクションを与えることで、プログラムをシャットダウンし、指示どおりに実行するように指示しました。
10/20/2012 11:06 AM <JUNCTION> Develop [C:\Develop2\]
10/20/2012 11:01 AM <SYMLINKD> Develop2 [\\obsidian\Develop]
直接行うことはできませんが、シンボリックリンクを作成すると、マップされたドライブ文字を指すことができるはずです。
Net Use e:\\ shares\folder#これを永続的に設定すると、次回の再起動で壊れてしまいます。
Cmdを使用して、リンクが必要な場所を参照します
cd c:\ folder
mklink/d name e:\
これで、c:\ folder\name \にアクセスするものはすべて\\ shares\folder \にアクセスします。
Microsoftによると、リモートマシン(サーバー)上の共有フォルダーをローカルフォルダーにマップすることはできません。例えば:
これは動作しません!!!!マイクロソフトが述べたように、少なくともJunctionまたはHard-links以外のリモートマシンではmklinkはできません。基本的にショートカットであるSymbolicリンクとしてのみ実行できます。そのため、特定のプログラムがサーバーと同じローカルフォルダーにアクセスする必要がある場合は、残念ながら運がありません!! WindowsはLinuxではありませんが、忘れないでください:-(
直接マッピングすることはできません。ファイルシステムの一部として登録されているシェルネームスペース拡張機能を実装して、必要な場所でルート化してから、内部的にUNCパスにアクセスできるようにすることができます。実装するのは簡単なことではありませんが、探している最終結果が得られるはずです。
\\ moo\cowをC:\ cow_filesにマッピングし、mooというサーバーがまだない場合(フォルダーを直接共有できる場合は、フォルダーを直接共有できるため、存在しないと想定)、次のようにできます。
Hostsファイル(または可能であれば実際のDNS)を編集して、mooをC:\ cow_filesのあるマシンにマップします。 (または、マッピングが必要なクライアントに対してディレクトリがローカルである場合はlocalhostに。)
そのマシンでC:\ cow_filesを牛として共有します。
その後、\\ moo\cowにマップして必要なファイルを取得できるはずです(何か見逃している場合を除きます:可能です)。
何度も試した後、私は最終的に、あなたが私が望んだ方法でそれを行うことができないことを理解しました。 Server 2008でmklink機能を使用してシンボリックリンクを試しましたが、.NET System.IO APIがシンボリックリンクを認識しないことがわかりました。そのため、シンボリックにリンクされているフォルダーでDirectory.GetFiles()を実行すると、エラーがスローされます。