【问题标题】:Is there a way to map a UNC path to a local folder on Windows 2003?有没有办法将 UNC 路径映射到 Windows 2003 上的本地文件夹?
【发布时间】:2010-12-02 19:54:46
【问题描述】:

我知道我可以将 UNC 路径映射到本地驱动器号。但是,我想知道是否有办法将 UNC 路径映射到本地文件夹。我有一个程序,它有一个硬编码到程序中的特定文件夹,我想尝试创建一个映射到 UNC 路径的同名文件夹,以便可以从网络共享访问数据。这是可行的吗?具体来说,这是在 Windows 2003 服务器上。

【问题讨论】:

    标签: windows path local unc


    【解决方案1】:

    是的,有一种方法可以将 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 是一个符号链接,指向一个远程机器,并拒绝遵守。我告诉程序闭嘴并通过给它一个指向本地资源的连接点来执行它所告诉的操作。

    10/20/2012  11:06 AM    <JUNCTION>     Develop [C:\Develop2\]
    10/20/2012  11:01 AM    <SYMLINKD>     Develop2 [\\obsidian\Develop]
    

    【讨论】:

    • 您是否检查以确保为符号链接评估启用了适当的设置:fsutil behavior query SymlinkEvaluation 您可能只需要根据符号链接的配置启用其中一些。例如。 fsutil behavior set SymlinkEvaluation R2R:1。这让我的 .net 程序能够comply
    • 这在 Windows 2003 上不起作用,就像 OP 要求的那样。添加了一个答案,使其看起来像 MkLink 安装在 Windows 2003 上并在 2003 上为 UNC 提供符号链接行为:stackoverflow.com/a/18593425/18475
    • 该注释确实适用于我使用的自定义应用程序。我的理解是操作系统层处理应用程序符号链接的转换,因此这使得最终用户可以无缝连接。
    • 额外的重定向是天才!这是解决我的问题的魔法(尝试让 gulp/bower 使用 UNC 路径为 VS 项目工作 - 由于在 Mac 上的 Parallels 中运行 Windows)。
    • grasmi 的评论对我有用。通过启用远程到远程,我基本上可以像对待本地资源一样对待链接
    【解决方案2】:

    这完全符合 OP 的要求 - 映射到网络共享的 Windows 2003 的符号链接。经过数小时查看其他人并对其进行测试后,我发现这是唯一可以与网络共享一起使用的组件。

    Windows XP 的符号链接驱动程序

    此实用程序适用于 XP 和 2003 映射到网络共享并创建符号链接:http://schinagl.priv.at/nt/ln/ln.html#symboliclinksforwindowsxp

    现在把它放在你放在路径上的目录中,你就可以使用senable.exe(和symlink.sys)和ln.exe创建符号链接(你需要从上面的站点以及它对 Visual C++ 运行时 DLL 的依赖)。

    额外奖励:伪造 MkLink

    将这两个额外的文件放入您拥有senable.exe 的同一目录中,并确保它们都在路径上。

    mklink.cmd:

    @echo off
    
    SET DIR=%~dp0%
    @powershell -NoProfile -ExecutionPolicy unrestricted -Command "& '%DIR%Symlink.ps1' %*"
    
    pushd "%DIR%"
    "%DIR%senable.exe" start
    popd
    

    符号链接.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 映像组件
    • Windows Server 2003 Service Pack 2
    • Windows Management Framework Core(这带来了 PowerShell 2)

    巧克力包

    我创建了一个巧克力包,可以为您完成所有这些工作:http://chocolatey.org/packages/win2003-mklink

    重要提示

    与常规符号链接不同,您不能简单地删除文件夹来删除符号链接文件夹。如果这样做,它将删除它指向的真实文件夹。所以使用时要格外小心。

    【讨论】:

    • 谢谢,这在 Windows XP 上对我有用。基本上,正如文档所说,需要安装驱动程序(senable.exe install)并符号链接路径(ln -s //host/share/folder name)。
    • @ferventcoder 遗憾的是,ln.exe 似乎有一个相当严格的许可证,它禁止重新分发。 schinagl.priv.at/nt/ln/license.txt
    • 太好了,看来我需要在安装过程中下载它。 :(
    • 我刚刚修复了此问题以符合许可条款(在安装包期间从官方发行版下载)。 @dabide
    【解决方案3】:

    您不能直接执行此操作,但如果您创建一个符号链接,您应该能够将其指向映射的驱动器号。

    net use e: \\\\shares\folder # 你需要设置这个持久化,否则下次重启会破坏它。

    使用cmd 浏览到您想要链接的位置:

    cd c:\folder

    mklink /d name e:\

    现在任何访问c:\folder\name\ 的东西都将访问\\\\shares\folder\

    【讨论】:

    • 使用这种方法,您需要考虑应用程序最终运行的上下文。映射的驱动器可能因用户而异,并且可能不适用于服务帐户,具体取决于您的环境。
    【解决方案4】:

    根据 Microsoft,您不能将远程计算机(服务器)上的共享文件夹映射到本地文件夹。

    例如,这将不起作用:

    • 服务器上的共享文件夹:\\\Server\share1
    • 本地机器上的映射共享:c:\MyProgram\Some_Useful_Files_Here

    正如微软所说,你不能在远程机器上做mklink;至少不适用于JunctionHard-links。您只能将其作为Symbolic 链接进行,这基本上是一种快捷方式。

    因此,如果某个程序需要访问与服务器上相同的本地文件夹,对不起,不走运! Windows 不是 Linux,我们不要忘记 :-(

    【讨论】:

    • 那么,使用符号链接有什么问题呢?这些让您可以使用路径,就好像该位置存在一样。根据其他地方的线程,“mklink /d ..”适用于远程。 (服务器 2008+ 或 Vista+)
    【解决方案5】:

    你不能直接映射它,不。您可以尝试实现一个作为文件系统的一部分注册的 Shell 命名空间扩展,以便您可以在需要的地方对其进行根目录,然后让它在内部访问 UNC 路径。实现起来不是一件容易的事,但它应该会给你你正在寻找的最终结果。

    【讨论】:

      【解决方案6】:

      经过多次尝试,我终于发现您无法按照我想要的方式进行操作。我尝试了使用 Server 2008 中的mklink 功能的符号链接,但事实证明.NET System.IO api 无法识别符号链接。

      因此,如果您对符号链接的文件夹执行Directory.GetFiles(),则会引发错误。

      【讨论】:

      • 您是否检查以确保为符号链接评估启用了适当的设置:fsutil behavior query SymlinkEvaluation 您可能只需要根据符号链接的配置启用其中一些。例如。 fsutil behavior set SymlinkEvaluation R2R:1
      • 这是错误的——看看我的回答stackoverflow.com/a/18593425/18475
      • 仅供参考,System.IO.Directory.GetFiles("C:\Whatever\MySymbolicLink") 在我的 Win 7 64 位上的 .Net 3.5 与使用“mklink /d C”创建的符号链接正常工作:\Whatever\MySymbolicLink some-target-path".
      【解决方案7】:

      假设您想将\\moo\cow 映射到C:\cow_files,并且还没有一个名为 moo 的服务器(如果有的话,您可以直接共享文件夹,所以我假设没有),您可以:

      1. 编辑主机文件(或您的实际 DNS,如果可以)以将 moo 映射到带有 C:\cow_files 的机器。 (或者如果该目录对于需要映射的客户端是本地的,则到 localhost。)

      2. 在该机器上将C:\cow_files 分享为cow

      然后您应该能够映射到 \\moo\cow 并获取您需要的文件,除非我遗漏了什么(这是可能的 :))。

      【讨论】:

      • 有用的建议,但是 OP 正在尝试做相反的事情:他有要求“C:\cow_files”的应用程序,并希望该应用程序仍然可以工作,即使文件现在存在于 \ \哞\牛。所以他需要一个符号链接“mklink \d C:\cow_files \\moo\cow”,而不是相反(通过 mklink 是不可能的,所以像你建议的那样在其他情况下会有用)。确实,他面临的唯一挑战是他使用的是旧系统,因此他无法使用“mklink”。
      猜你喜欢
      • 2011-02-16
      • 2012-08-22
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      相关资源
      最近更新 更多