gpt4 book ai didi

java - 如何创建符号链接(symbolic link)

转载 作者:行者123 更新时间:2023-12-02 03:01:44 25 4
gpt4 key购买 nike

在启用了开发人员模式的 Windows 10 版本 1803 内部版本 17134.523 上的 NTFS 卷上,我有一个文件 myfile。我可以使用 mklink 建立指向该文件的符号链接(symbolic link)。但是,如果我在 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 的 Windows 子系统 (WSL) 上也可以正常工作

如何在 Windows 上实现此功能而不进入 WSL?那么这个异常到底是在哪里抛出的呢?

最佳答案

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

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

<小时/>

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

关于java - 如何创建符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com