如何设置 Windows 执行级别以向用户询问 Rust 程序的管理员权限?

Tom*_*kic 5 windows rust

我正在编写一个 Windows CLI 应用程序,我需要以管理员身份运行它。在 C# 中,我会将这一行添加到 app.manifest:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
Run Code Online (Sandbox Code Playgroud)

我如何在 Rust 中做到这一点?

sil*_*rog 7

太晚了,但还是要回答。:-)

请到winres图书馆看看。它包含以下示例:

以下清单将 exe 标记为请求管理员权限。因此,每次执行时,都会出现一个 Windows UAC 对话框。

let mut res = winres::WindowsResource::new();
res.set_manifest(r#"
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
        </requestedPrivileges>
    </security>
</trustInfo>
</assembly>
"#);
Run Code Online (Sandbox Code Playgroud)

完整示例在此处记录并可用。

我一直在一个包含图标并需要管理员权限的项目中使用这个库,它的build.rs使用winres托管在这里。查看生成的可执行文件:在此处输入图片说明

HTH

  • 我很欣赏对复古问题的现代回答,谢谢。 (2认同)

Seb*_*edl 2

有一个开放的 RFC #721 用于 Rust 中的清单支持

除了讨论添加本机支持的方法之外,这些帖子还包含使用链接器开关或其他工具的各种解决方法的链接。目前还没有好的方法来传递链接器开关;您必须将一个rustflags选项放入Cargo 配置文件中,并将参数传递给rustc如下所示:["-C", "link-args=/exoticlinkerswitch"]。这显然不太便携。

对于工具,您可以使用mt.exeWindows SDK 在编译程序后将清单添加到您的程序中

请注意,Cargo 目前无法自动执行构建后步骤。但是,有一个 Cargo 扩展cargo-make支持此类构建过程。您可以通过安装它cargo install cargo-make