在 Go 中请求 UAC 提升

Mr.*_*eah 2 windows winapi uac go

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

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

Von*_*onC 6

您可以尝试检查项目w32:它有一个shell32.go ShellExecute()可能有用的项目。

w32是 Go 编程语言的 windows api 的包装器。

它将 win32 api 包装为“Go 风格”,使它们更易于使用。


2020年更新,从2014年开始,该包golang.org/x/sys/windows确实有ShellExecute()功能了。

Cliven提到Jeremy Black的博文“在需要管理员权限时通过 UAC 提升重新启动 Windows Golang 程序

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

    _, err := os.Open("\\\\.\\PHYSICALDRIVE0")
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后 Jeremy 使用该ShellExecute()函数来调用runas(在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)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)