UNCパスをローカルドライブ文字にマップできることを知っています。ただし、UNCパスをローカルフォルダーにマップする方法があるかどうか疑問に思っています。プログラムにハードコードされた特定のフォルダーを持つプログラムがあり、ネットワーク共有からデータにアクセスできるように、UNCパスにマップされた同じ名前のフォルダーを作成してみたいと思っています。これは実行可能ですか?具体的には、これはWindows2003サーバー上にあります。
7 に答える
はい、UNCパスをローカルフォルダにマップする方法があります。
C:\>mklink /D Develop \\obsidian\Develop
symbolic link created for Develop <<===>> \\obsidian\Develop
これは、ビルドサーバーで自分の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
であることに気づき、準拠することを拒否したためです。私はプログラムに、ローカルリソースを指すジャンクションを与えることによって、シャットダウンして、言われたことを実行するように指示しました。
10/20/2012 11:06 AM <JUNCTION> Develop [C:\Develop2\]
10/20/2012 11:01 AM <SYMLINKD> Develop2 [\\obsidian\Develop]
これは、OPが要求したもの、つまりネットワーク共有にマップされるWindows2003のシンボリックリンクを正確に満たしています。何時間も他の人を見てテストした後、これはネットワーク共有で動作することがわかった唯一のコンポーネントです。
WindowsXP用のシンボリックリンクドライバ
このユーティリティは、XPと2003の両方でネットワーク共有へのマッピングとシンボリックリンクの作成で機能します:http ://schinagl.priv.at/nt/ln/ln.html#symboliclinksforwindowsxp
これをパスに配置したディレクトリに配置すると、senable.exe
(with symlink.sys
)とを使用してシンボリックリンクを作成できますln.exe
(上記のサイトからも、Visual C ++ランタイムDLLへの依存関係とともに必要になります)。
追加ボーナス:MkLinkを偽造する
これらの追加の2つのファイルを同じディレクトリにsenable.exe
配置し、これがすべてパス上にあることを確認します。
mklink.cmd:
@echo off
SET DIR=%~dp0%
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "& '%DIR%Symlink.ps1' %*"
pushd "%DIR%"
"%DIR%senable.exe" start
popd
Symlink.ps1:
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に何が必要かはまだ完全にはわかりません)。
- Microsoft .NET Framework 2.0 Service Pack 1
- Windows Imaging Component
- Windows Server 2003 Service Pack 2
- Windows Management Framework Core(これにより、PowerShell 2が導入されます)
Chocolateyパッケージ
私はあなたのためにこれをすべて行うチョコレートのパッケージを作成しました:http://chocolatey.org/packages/win2003-mklink
重要な注意点
通常のシンボリックリンクとは異なり、単にフォルダを削除してシンボリックリンクフォルダを削除することはできません。これを行うと、それが指している実際のフォルダーが削除されます。したがって、細心の注意を払って使用してください。
直接行うことはできませんが、シンボリックリンクを作成すると、マップされたドライブ文字を指すことができるはずです。
net use e: \\\\shares\folder
#これを永続的に設定する必要があります。そうしないと、次に再起動すると機能しなくなります。
リンクが必要な場所を使用cmd
して参照します。
cd c:\folder
mklink /d name e:\
これで、アクセスするものはすべてアクセスc:\folder\name\
するようになります\\\\shares\folder\
Microsoftによると、リモートマシン(サーバー)上の共有フォルダーをローカルフォルダーにマップすることはできません。
たとえば、これは機能しません。
- サーバー上の共有フォルダー:
\\\Server\share1
- ローカルマシン上のマップされた共有:
c:\MyProgram\Some_Useful_Files_Here
mklink
Microsoftが述べたように、リモートマシンでは実行できません。少なくともJunction
またはのためではありませんHard-links
。Symbolic
基本的にショートカットであるリンクとしてのみ実行できます。
したがって、特定のプログラムがサーバー上と同じローカルフォルダーにアクセスする必要がある場合は、申し訳ありません。WindowsはLinuxではありません。忘れないでください:-(
直接マッピングすることはできません。ファイルシステムの一部として登録されているシェル名前空間拡張機能を実装して、必要な場所にルート化してから、内部でUNCパスにアクセスできるようにすることができます。実装するのは簡単なことではありませんが、探している最終結果が得られるはずです。
にマップする必要\\moo\cow
がC:\cow_files
あり、mooというサーバーがまだ存在しないと仮定すると(存在する場合は、フォルダーを直接共有できるため、存在しないと想定します)、次のことができます。
ホストファイル(または可能であれば実際のDNS)を編集して、そのファイルが含ま
moo
れるマシンにマップしC:\cow_files
ます。(または、ディレクトリがマッピングを必要とするクライアントに対してローカルである場合は、localhostに送信します。)そのマシンで共有
C:\cow_files
します。cow
\\moo\cow
そうすれば、私が何かを見逃していない限り、必要なファイルにマップして取得できるはずです(これは可能です:))。
何度も試してみた結果、思い通りにできないことがようやくわかりました。mklink
Server 2008の機能を使用してシンボリックリンクを試しましたが、 System.IO
.NETAPIがシンボリックリンクを認識しないことがわかりました。
したがって、Directory.GetFiles()
シンボリックにリンクされているフォルダでを実行すると、エラーがスローされます。