如何创建符号链接

时间:2019-02-03 16:06:50

标签: java windows nio symlink

在启用了“开发人员模式”的Windows 10版本1803内部版本17134.523的NTFS卷上,我有一个文件myfile。我可以使用mklink对此文件进行符号链接。但是,如果我在java jre Files.createSymbolicLink上调用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 1.8.0_191-8u191-b12-0ubuntu0.18.10.1-b12的Linux的Windows子系统(WSL)上,同样的工作没有问题

如何在不使用WSL的情况下在Windows上进行此项工作?到底在哪里抛出该异常?

2 个答案:

答案 0 :(得分:2)

创建符号链接需要SeCreateSymbolicLinkPrivilege,除非系统处于开发人员模式并且使用标志SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE(*)调用WinAPI CreateSymbolicLink。 CMD的mklink命令在Windows 10中使用此标志。显然,Java JRE版本1.8.0_201不使用。

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


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

答案 1 :(得分:-1)

它与Java不相关,而与OS相关。请查看以下链接: How to create Soft symbolic Link using java.nio.Files

关闭了UAC的Win10-我必须设置“本地策略”>“安全选项”>“用户帐户控制”:以“管理员批准模式”运行所有管理员=“禁用”-否则-相同的FileSystemException:客户端没有所需的特权