go 编译的 windows 进程(exe)以管理员权限启动(UAC)

引言

windows 系统,在打开某些 exe 的时候,会弹出“用户账户控制(UAC)”的弹窗 “你要允许来自xx发布者的此应用对你的设备进行更改吗?”

UACUser Account Control,用户账户控制)是 Windows 操作系统中的一个安全组件,如果程序未通过管理员权限启动,在涉及一些敏感操作时可能会导致应用程序发生错误。

本篇简单介绍 2 种在 go 中以管理员权限启动程序的方式。

实现

这里介绍 2 种方式:

  1. manifest,使用 github.com/akavel/rsrc 库,一般都这么用。
  2. 运行时重新启动,动态提权。

一、manifest

标准的方式,通过嵌入清单文件触发 UAC 提示。

1. 创建 app.manifest 文件,内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>

2. 嵌入清单到 go 程序

  1. 安装 rsrc 工具
go get github.com/akavel/rsrc
  1. 生成资源文件
rsrc -manifest app.manifest -o app.syso# -arch 平台
# -manifest  manifest文件,可以添加管理员权限启动
# -ico  图标文件
# -o  目标文件(.syso)
# rsrc -arch amd64 -manifest app.manifest -o app.syso -ico favicon.ico

3. 编译 go 程序

直接 go build 即可,**注意:上述通过 rsrc 生成的 syso 需要放到项目路径进行 build **。

二、动态提权

适用于应用程序并不是所有的操作都需要使用管理员权限,只在用户需要的时候进行提示,然后重启应用动态提权。

直接上代码,主要函数解释:

  • isAdmin():通过尝试访问系统设备检测权限。
  • runAsAdmin():使用 ShellExecute 以管理员权限重新启动程序。
package mainimport ("fmt""os""syscall""time""github.com/google/uuid""golang.org/x/sys/windows"
)// 判断程序是否为管理员启动,不是则需要重启// 检测当前是否以管理员权限运行
func isAdmin() bool {_, err := os.Open("\\\\.\\PHYSICALDRIVE0")return err == nil
}// 以管理员权限重新启动进程,并传递事件名称
func runAsAdmin(eventName string) error {exe, _ := os.Executable()args := fmt.Sprintf(`--event-name "%s"`, eventName) // 传递事件名称verbPtr, _ := syscall.UTF16PtrFromString("runas")exePtr, _ := syscall.UTF16PtrFromString(exe)argsPtr, _ := syscall.UTF16PtrFromString(args)cwd, _ := os.Getwd()cwdPtr, _ := syscall.UTF16PtrFromString(cwd)showCmd := int32(windows.SW_NORMAL)return windows.ShellExecute(0, verbPtr, exePtr, argsPtr, cwdPtr, showCmd)
}// 父进程等待事件触发
func waitForChildReady(eventName string) bool {// 创建事件对象(初始状态为未触发)event, err := windows.CreateEvent(nil, // 默认安全属性0,   // 手动重置(false表示自动重置)0,   // 初始状态未触发windows.StringToUTF16Ptr(eventName),)if err != nil {fmt.Println("CreateEvent error:", err)return false}defer windows.CloseHandle(event)// 等待事件触发(最多10秒)const timeout = 10 * time.Secondresult, err := windows.WaitForSingleObject(event, uint32(timeout.Milliseconds()))if err != nil {fmt.Println("WaitForSingleObject error:", err)return false}return result == windows.WAIT_OBJECT_0
}// 子进程触发事件
func signalParent(eventName string) {// 打开事件对象(需要EVENT_MODIFY_STATE权限)event, err := windows.OpenEvent(windows.EVENT_MODIFY_STATE,false,windows.StringToUTF16Ptr(eventName),)if err != nil {fmt.Println("OpenEvent error:", err)os.Exit(1)}defer windows.CloseHandle(event)// 触发事件if err := windows.SetEvent(event); err != nil {fmt.Println("SetEvent error:", err)os.Exit(1)}
}func main() {// 解析命令行参数中的事件名称var eventName stringfor i, arg := range os.Args {if arg == "--event-name" && i+1 < len(os.Args) {eventName = os.Args[i+1]break}}if isAdmin() {// 管理员模式下,触发事件并执行业务逻辑if eventName != "" {signalParent(eventName)}fmt.Println("以管理员模式启动!")// TODO: 主程序逻辑fmt.Println("按任意键退出程序...")// 直接从标准输入读取一个字节,用于检测按键操作buf := make([]byte, 1)os.Stdin.Read(buf)} else {// 非管理员模式,生成唯一事件名称并重启eventName := uuid.New().String()if err := runAsAdmin(eventName); err != nil {fmt.Println("Failed to restart as admin:", err)os.Exit(1)}// 等待子进程就绪if waitForChildReady(eventName) {fmt.Println("Child process started successfully.")os.Exit(0)} else {fmt.Println("Failed to start child process.")os.Exit(1)}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go.mod介绍

在 Go 项目中&#xff0c;.mod 文件&#xff08;全称 go.mod&#xff09;是 Go 语言模块&#xff08;Module&#xff09;系统的核心配置文件&#xff0c;用于定义和管理项目的依赖关系、模块名称及兼容性规则。以下是其核心作用与结构的详细说明&#xff1a; 一、go.mod 文件的…

基于CATIA参数化管道建模的自动化插件开发实践——NX建模之管道命令的参考与移植

引言 在机械设计领域&#xff0c;CATIA作为行业领先的CAD软件&#xff0c;其强大的参数化建模能力备受青睐。本文介绍如何利用Python的PySide6框架与CATIA二次开发技术&#xff0c;开发一款智能管状体生成工具。该工具借鉴了同类工业软件NX的建模的管道命令&#xff0c;通过Py…

centos7使用yum快速安装最新版本Jenkins-2.462.3

Jenkins支持多种安装方式&#xff1a;yum安装、war包安装、Docker安装等。 官方下载地址&#xff1a;https://www.jenkins.io/zh/download 本次实验使用yum方式安装Jenkins LTS长期支持版&#xff0c;版本为 2.462.3。 一、Jenkins基础环境的安装与配置 1.1&#xff1a;基本…

BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化

引言:视频学习的痛点与BiliNote的解决方案 随着知识视频化趋势的加速,B站、YouTube等平台成为学习与信息获取的重要渠道,但手动记录笔记耗时低效、信息碎片化等问题依然突出。BiliNote的出现,通过AI驱动的自动化流程,将视频内容转化为结构清晰的Markdown笔记,支持截图插…

DAX Studio将PowerBI与EXCEL连接

DAX Studio将PowerBI与EXCEL连接 具体步骤如下&#xff1a; 第一步&#xff1a;先打开一个PowerBI的文件&#xff0c;在外部工具栏里打开DAXStudio&#xff0c;如图&#xff1a; 第二步&#xff1a;DAXStudio界面&#xff0c;点击Advanced选项卡-->Analyze in Excel&#…

Redis-cli常用参数及功能的详细说明

Redis-cli常用参数及功能的详细说明 相关参考知识书籍 <<Redis运维与开发>> 以下是Redis-cli常用参数及功能的详细说明 1. **-r​&#xff08;重复执行命令&#xff09;** 作用&#xff1a;重复执行指定命令多次。 示例&#xff1a;执行3次PING​命令&#xff1…

百度文心4.5 Turbo与DeepSeek、豆包、元宝对比:技术路径与市场格局分析​​

今日&#xff0c;百度发布文心大模型4.5 Turbo与X1 Turbo&#xff0c;主打多模态能力提升与成本优化&#xff0c;成为AI搜索领域的重要技术迭代。与此同时&#xff0c;DeepSeek、豆包&#xff08;字节跳动&#xff09;、腾讯元宝等竞品凭借差异化定位持续抢占市场。本文将从技术…

施工配电箱巡检二维码应用

在过去&#xff0c;施工配电箱的巡检主要依赖于纸质记录方式。巡检人员每次巡检时&#xff0c;都要在纸质表格上详细填写配电箱的各项参数、运行状况以及巡检时间等信息。这种方式在实际操作中暴露出诸多严重问题&#xff0c;信息易出现错误、数据会有造假现象、数据量庞大整理…

国产AI大模型超深度横评:技术参数全解、商业落地全场景拆解

评测方法论与指标体系 评测框架设计 采用三层评估体系&#xff0c;涵盖技术性能、商业价值、社会效益三大维度&#xff0c;细分为12个二级指标、36个三级指标&#xff1a; 测试环境配置 项目配置详情硬件平台8NVIDIA H100集群&#xff0c;NVLink全互联&#xff0c;3TB内存软…

施工安全巡检二维码制作

进入新时代以来&#xff0c;人们对安全的重视程度越来越高。特别在建筑施工行业&#xff0c;安全不仅是关乎着工人的性命&#xff0c;更是承载着工人背后家庭的幸福生活。此时就诞生了安全巡检的工作&#xff0c;而巡检过程中内容庞杂&#xff0c;安全生产检查、隐患排查、施工…

【AI平台】n8n入门3:第二个工作流,链接网上大模型(含三种方式)

前言 n8n是一款开源的低代码自动化工具&#xff0c;专注于AI工作流构建&#xff0c;支持灵活的自定义与集成。 就是可以把大模型和其他工具联合起来&#xff0c;这就厉害了。而且&#xff0c;免费功能又强大&#xff0c;目前很火&#xff0c;来研究一下。 功能说明 本节目标…

【Test】单例模式❗

文章目录 1. 单例模式2. 单例模式简单示例3. 懒汉模式4. 饿汉模式5. 懒汉式和饿汉式的区别 1. 单例模式 &#x1f427;定义&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 单例模式是一种常用的软件设计模式&#xff0c;在它的核心结构中只包…

Kotlin 协程在 LiveData 中的完美封装:CoroutineLiveData 全解

&#x1f300; 什么是 CoroutineLiveData&#xff1f; CoroutineLiveData 是 liveData 构造器创建出来的 LiveData 对象&#xff0c;它是 Jetpack 中为协程量身打造的 LiveData 版本&#xff0c;主要用来让我们在 LiveData 的作用域内&#xff0c;安全、方便地使用协程。 它的…

在 Java 项目中搭建和部署 Docker 的详细流程

引言 在现代软件开发中&#xff0c;Docker 已成为一种流行的工具&#xff0c;用于简化应用的部署和运行环境的一致性。本文将详细介绍如何在 Java 项目中搭建和部署 Docker&#xff0c;包括配置文件、代码示例以及流程图。 一、整体工作流程 以下是整个流程的概览&#xff1a…

阿里云域名迁移至Amazon Route 53的完整指南

在当今的云计算时代,域名管理和DNS服务的选择对于网站性能和可用性至关重要。本文将详细介绍如何将阿里云上的域名迁移至Amazon Route 53,以充分利用AWS生态系统的优势。 1. 简介 Amazon Route 53是一种可用性高、可扩展性强的域名系统(DNS)web服务。它为开发者和企业提供了一…

AI网络渗透kali应用(gptshell)

kali安装gptshell 一、shellGPT 工具介绍 ShellGPT‌是一款由AI大型语言模型&#xff08;LLM&#xff09;驱动的终端命令行工具。它能帮助用户直接在终端与AI交互&#xff0c;自动生成、解释、执行各类 Linux 命令&#xff0c;大大提升了运维和开发效率。ShellGPT 支持接入 O…

STM32 I2C总线通信协议

引言 在嵌入式系统开发领域&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;总线作为经典的双线制串行通信协议&#xff0c;凭借其简洁的物理层设计和灵活的通信机制&#xff0c;在传感器互联、存储设备控制、显示模块驱动等场景中占据重要地位。本文将深入剖…

spring,spring boot, spring cloud三者区别

Spring Framework vs Spring Boot vs Spring Cloud 1. Spring Framework 定位&#xff1a;基础框架&#xff0c;提供核心的IoC容器、AOP、事务管理、数据访问、Web MVC等能力。特点&#xff1a; 模块化设计&#xff1a;可单独使用某些模块&#xff08;如仅用Spring JDBC&…

每日算法-250425

每日算法打卡 - 2025年4月25日 记录今天完成的几道 LeetCode 算法题&#xff0c;分享解题思路和代码。 2178. 拆分成最多数目的正偶数之和 题目 解题思路 贪心算法 解题过程 题目要求我们将一个偶数 finalSum 拆分成尽可能多的 不同 正偶数之和。 为了使拆分出的数字数量…

SQL进阶知识:四、索引优化

今天介绍下关于索引优化的详细介绍&#xff0c;并结合MySQL数据库提供实际例子。 索引优化是数据库性能优化的关键环节之一&#xff0c;尤其是在处理大量数据时。索引可以加快查询速度&#xff0c;减少数据扫描范围&#xff0c;但不当的索引设计也可能导致性能问题。以下是关于…