如何创建符号链接
How do I create a symlink
在 Windows 10 版本 1803 build 17134.523 的 NTFS 卷上启用了开发者模式,我有一个文件 myfile
。我可以用 mklink
建立指向这个文件的符号链接。但是,如果我在 java jre 1.8.0_201
上调用 Files.createSymbolicLink
,如果抛出:
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 (WSL) 的 Windows 子系统上同样可以正常工作
如何在不进入 WSL 的情况下在 windows 上完成这项工作?这个异常到底抛在哪里?
创建符号链接需要 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>
.
查询reparse point的类型
(*) 文档说“[s]指定此标志以允许在进程未提升时创建符号链接”。更准确地说,此标志允许在没有 SeCreateSymbolicLinkPrivilege 的情况下创建符号链接,这仅与具有默认系统设置的 "elevated" 有关。就个人而言,我将此权限授予 "Authenticated Users" 组,在这种情况下创建符号链接不需要提升到完全管理员访问权限。
这与您的 Java 无关,仅与您的 os 有关。请看下面link:
How to create Soft symbolic Link using java.nio.Files
关闭 UAC 的 Win10 - 我必须设置本地策略 > 安全选项 > 用户帐户控制:运行 所有管理员处于管理员批准模式 = 禁用 - 否则 - 相同的 FileSystemException:未持有所需的权限由客户
在 Windows 10 版本 1803 build 17134.523 的 NTFS 卷上启用了开发者模式,我有一个文件 myfile
。我可以用 mklink
建立指向这个文件的符号链接。但是,如果我在 java jre 1.8.0_201
上调用 Files.createSymbolicLink
,如果抛出:
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
如何在不进入 WSL 的情况下在 windows 上完成这项工作?这个异常到底抛在哪里?
创建符号链接需要 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 的情况下创建符号链接,这仅与具有默认系统设置的 "elevated" 有关。就个人而言,我将此权限授予 "Authenticated Users" 组,在这种情况下创建符号链接不需要提升到完全管理员访问权限。
这与您的 Java 无关,仅与您的 os 有关。请看下面link: How to create Soft symbolic Link using java.nio.Files
关闭 UAC 的 Win10 - 我必须设置本地策略 > 安全选项 > 用户帐户控制:运行 所有管理员处于管理员批准模式 = 禁用 - 否则 - 相同的 FileSystemException:未持有所需的权限由客户