代码之家  ›  专栏  ›  技术社区  ›  Martijn

如何创建符号链接

  •  0
  • Martijn  · 技术社区  · 5 年前

    在Windows 10版本1803上的NTFS卷上,在启用了开发人员模式的内部版本17134.523上,我有一个文件 myfile . 我可以用符号链接到这个文件 mklink . 不过,如果我打电话 Files.createSymbolicLink 关于java jre 1.8.0_201 ,如果抛出:

    java.nio.file.FileSystemException: linkname: A required privilege is not held by the client.
    
        at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
        at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
        at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
        at sun.nio.fs.WindowsFileSystemProvider.createSymbolicLink(Unknown Source)
        at java.nio.file.Files.createSymbolicLink(Unknown Source)
        at CreateLinks.main(CreateLinks.java:15)
    

    在带有jre的Windows Linux子系统(WSL)上同样可以正常工作 1.8.0_191-8u191-b12-0ubuntu0.18.10.1-b12

    如何在不进入WSL的情况下在windows上工作?这个异常究竟是在哪里引发的?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Eryk Sun    5 年前

    创建符号链接需要secreateSymbolicClinkPrivilege,除非系统处于开发人员模式和WinAPI CreateSymbolicLink 是用旗子打电话的 SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE (*). 指挥官 mklink 命令在Windows 10中使用此标志。显然,javajreversion1.8.0_201没有。

    至于WSL,它继承了运行它的安全上下文。如果从具有secreateSymbolClinkPrivilege的登录运行,最新版本的WSL将在drvfs(例如NTFS)卷上创建普通的Windows符号链接。否则,WSL使用自定义符号链接类型,该类型基于 IO_REPARSE_TAG_LX_SYMLINK (0xA000001D)重分析点而不是普通点 IO_REPARSE_TAG_SYMLINK (0xa00000c)重新分析点。您可以通过以下命令查询重分析点的类型 fsutil reparsepoint query <filename>


    (*)文档说“[s]指定此标志以允许在进程未提升时创建符号链接”。更准确地说,此标志允许在不使用secreateSymbolicClinkPrivilege的情况下创建符号链接,而secreateSymbolicClinkPrivilege只与使用默认系统设置“提升”有关。就我个人而言,我将此权限授予“Authenticated Users”组,在这种情况下,创建符号链接不需要提升到完全的管理员访问权限。

        2
  •  -1
  •   Sajjad Rostami    5 年前

    它与Java无关,只与操作系统有关。请参阅以下链接: How to create Soft symbolic Link using java.nio.Files

    关闭UAC的Win10-我必须设置本地策略>安全选项>用户帐户控制:在管理审批模式下运行所有管理员=禁用-否则-相同的文件系统异常:客户端没有所需的权限