首页 >后端开发 >Golang >如何使用 Go 以编程方式在 Windows 中请求管理员权限?

如何使用 Go 以编程方式在 Windows 中请求管理员权限?

Linda Hamilton
Linda Hamilton原创
2024-11-08 20:37:02967浏览

How to Programmatically Request Administrator Privileges in Windows with Go?

使用 Go 在 Windows 中以编程方式请求管理员权限

在没有管理权限的情况下运行应用程序可能会限制其功能。本文提供了一个解决方案,以应对使用 Go 在 Windows 中自动请求和获取管理员权限的过程的挑战。

为了说明该问题,请考虑以下尝试写入 Windows 目录中的文件的代码:

package main

import (
    "fmt"
    "io/ioutil"
    "time"
)

func main() {
    err := ioutil.WriteFile("C:/Windows/test.txt", []byte("TESTING!"), 0644)
    if err != nil {
        fmt.Println(err.Error())
        time.Sleep(time.Second * 3)
    }
}

如果编译并运行此代码,它将失败并显示错误“访问被拒绝”。这是因为该进程未以提升的权限运行。

要解决此问题,您可以实施一种技术来检测您是否以管理员身份运行,如果不是,则使用 UAC(用户帐户控制)提示。这将允许应用程序在大多数时间以标准用户身份运行,仅在必要时提升。

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
}

此解决方案提供了一种方便的方法,可以在必要时自动提升应用程序的权限,而不需要清单或任何手动用户操作,例如右键单击并选择“以管理员身份运行”。

以上是如何使用 Go 以编程方式在 Windows 中请求管理员权限?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn