首页 > 后端开发 > Golang > 正文

如何在 Windows 中自动为我的 Go 应用程序请求管理员权限?

Linda Hamilton
发布: 2024-11-08 05:34:01
原创
696 人浏览过

How can I automatically request administrator privileges for my Go application in Windows?

使用 Go 在 Windows 中请求管理员权限

本文探讨了如何在启动应用程序时消除手动选择“以管理员身份运行”的需要,使其能够提示自动获取管理员权限。

问题描述:

问题源于无法无需提升权限即可写入 Windows 系统文件夹 (C:Windows)。运行提供的代码时,应用程序无法写入 test.txt 文件,并出现“访问被拒绝”错误。

解决方案:

要解决此问题,需要使用一种涉及 self-提出了以提升的权限重新启动应用程序。该技术采用以下方法:

1。检查管理员状态:

amAdmin() 函数通过尝试打开 .PHYSICALDRIVE0 设备来检查应用程序是否以管理员身份运行。如果授予访问权限,该函数返回 true;否则,返回 false。

2.以海拔重新启动:

如果 amAdmin() 返回 false,则执行 runMeElevated() 函数。此函数使用 Windows ShellExecute API 以提升的权限重新启动应用程序。它指定“runas”动词,提示用户获得管理员权限。

3.主函数执行:

主函数首先检查应用程序是否具有管理员权限。如果没有,它会调用 runMeElevated() 函数以管理员身份重新启动自身。如果应用程序已经以提升的权限运行,它将继续执行预期的代码。

代码示例:

package main

import (
    "fmt"
    "golang.org/x/sys/windows"
    "os"
    "syscall"
    "time"
)

func main() {
    // If not elevated, relaunch by shellexecute with runas verb set
    if !amAdmin() {
        runMeElevated()
    }
    time.Sleep(10 * time.Second)

}

func runMeElevated() {
    verb := "runas"
    exe, _ := os.Executable()
    cwd, _ := os.Getwd()
    args := strings.Join(os.Args[1:], " ")

    verbPtr, _ := syscall.UTF16PtrFromString(verb)
    exePtr, _ := syscall.UTF16PtrFromString(exe)
    cwdPtr, _ := syscall.UTF16PtrFromString(cwd)
    argPtr, _ := syscall.UTF16PtrFromString(args)

    var showCmd int32 = 1 //SW_NORMAL

    err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd)
    if err != nil {
        fmt.Println(err)
    }
}

func amAdmin() bool {
    _, err := os.Open("\\.\PHYSICALDRIVE0")
    if err != nil {
        fmt.Println("admin no")
        return false
    }
    fmt.Println("admin yes")
    return true
}
登录后复制

通过实现此方法,应用程序将正常启动时自动提示管理员权限,无需通过右键菜单手动提升。

以上是如何在 Windows 中自动为我的 Go 应用程序请求管理员权限?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板