use std::os::windows::fs;
// https://doc.rust-lang.org/std/os/windows/fs/fn.symlink_file.html
use std::io::*;
use std::io::{self, Read, Stdin};
fn input_from() -> io::Result<()> {
let mut buffer = String::new();
let mut stdin = io::stdin(); // We get `Stdin` here.
stdin.read_to_string(&mut buffer)?;
Ok(())
}
fn main() -> std::io::Result<()> {
let mut shortcut_dir = String::from("D:\\winr\\");
println!("Your script path:");
let mut buffer1 = String::new();
let mut stdin = io::stdin();
stdin
.read_line(&mut buffer1)
.expect("error: unable to read user input");
buffer1.pop();
println!("Your shortcut name:");
let mut buffer2 = String::new();
let mut stdin: Stdin = io::stdin();
stdin
.read_line(&mut buffer2)
.expect("error: unable to read user input");
println!("buffer1 is:{:?}", buffer1);
buffer2.pop();
let mut buffer2 = &buffer2[..];
println!("buffer2 is:{:?}", buffer2);
shortcut_dir.push_str(&buffer2);
let mut buffer3 = shortcut_dir;
println!("buffer3 is:{:?}", buffer3);
fs::symlink_file(buffer1, buffer3)?;
Ok(())
}
它会抱怨:
Error: Os { code: 1314, kind: Other, message: "A required privilege is not held by the client" }
error: process didn't exit successfully: `target\debug\ssdkqn.exe` (exit code: 1)
我使用的是Windows。当我在管理员模式下运行这个脚本时,这个问题就消失了。为什么需要管理员权限才能创建符号链接?
发布于 2020-11-25 01:49:04
这是Windows的一项要求,除非您在Windows 10上以开发人员模式运行。
从4.2BSD开始,Unix就有了符号链接。他们的行为广为人知,也被广泛使用。任何Unix程序员都知道符号链接。
然而,当它们可用时,开发人员必须意识到某些安全问题集。例如,存在检查时间/使用时间竞争条件,其中符号链接的目标可以更改,因此,假设只因为检查了路径就意味着目标不会更改是不安全的。有经验的Unix开发人员知道这些,并仔细考虑它们。
Windows在上添加符号链接的时间相对较晚(Windows Vista for userspace),因此,开发人员不习惯使用它们。有人担心,启用它们会导致较旧的程序或不熟悉符号链接的开发人员编写的程序出现安全问题,其中一些问题无法修复。因此,决定将符号链接的使用限制为管理员,除非用户具有Create symbolic权限。
如果您使用的是Windows10,您可以启用开发人员模式并重新启动,您将能够创建符号链接。您也可以在没有权限的WSL下创建符号链接。
发布于 2021-04-01 21:52:35
如果您可以接受解决方法,则Windows支持硬链接和目录连接,这两者都可以在没有管理权限的情况下创建。不幸的是,symlink_dir()
和symlink_file()
似乎不允许连接或硬链接。
if source.is_dir() {
std::process::Command::new("cmd")
.arg("/C")
.arg("mklink")
.arg("/J")
.arg(destination)
.arg(source)
.output()?;
} else {
std::process::Command::new("cmd")
.arg("/C")
.arg("mklink")
.arg("/H")
.arg(destination)
.arg(source)
.output()?;
}
https://stackoverflow.com/questions/64991523
复制相似问题