windows - 在 Go 中请求 UAC 提升

标签 windows winapi go uac

在 Go 中有什么方法可以将新进程或线程提升为管理员?

似乎 ShellExecute() 在 Go 中不可用,并且无法使用 CreateProcess() 提升。我不知道还有什么可能。

最佳答案

你可以试试看项目w32 : 它有一个 shell32.go ShellExecute()这可能会有用。

w32 is a wrapper of windows apis for the Go Programming Language.

It wraps win32 apis to "Go style" to make them easier to use.


2020年更新,自2014年以来,包golang.org/x/sys/windows确实有 ShellExecute()功能。

Cliven提及 Jeremy Black的博文“Relaunch Windows Golang program with UAC elevation when admin rights needed

  • Jeremy 首先通过尝试打开 \\.\PHYSICALDRIVE0(根据 reddit suggestion)检测程序是否已经以管理员身份运行

    _, err := os.Open("\\\\.\\PHYSICALDRIVE0")
    
  • 然后 Jeremy 使用 ShellExecute() 函数调用 runas (在 Elevating During Runtime 的“Michael Haephrati ”中描述)

    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)
        }
    }
    

关于windows - 在 Go 中请求 UAC 提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26068139/

相关文章:

c++ - fstream给我错误的文件大小

java - TOmcat7 在 Eclipse Kepler 中不工作

c++ - 使用 C++ 在 Windows 下获取 Harddrrive 性能

go - 从大文件中删除特定行的最快方法是什么?

go - go benchmark 中的 allocs/op 和 B/op 是什么意思?

Android 不被识别为内部或外部命令 - 路径变量

python - 在 python 中有更好的方法吗?我正在尝试解析 Windows 'systeminfo' 命令

c++ - 使用 win32 API 或 GDI+ 保存到位图

c++ - ShowWindow() 立即隐藏 SW_HIDE 窗口,没有效果

go - 同步原语原子包