【问题标题】:Request UAC elevation in Go在 Go 中请求 UAC 提升
【发布时间】:2014-11-21 23:18:37
【问题描述】:

有没有办法在 Go 中将新进程或线程提升为管理员?

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

【问题讨论】:

    标签: windows winapi go uac


    【解决方案1】:

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

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

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


    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(在Michael Haephrati 中的“Elevating During Runtime”中描述)

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

    【讨论】:

    【解决方案2】:

    CreateProcess()不支持运行提升的进程,但是下面的文章中有一个第三方的CreateProcessElevated()函数可以:

    Vista UAC: The Definitive Guide

    它还提供了其他几个函数的提升版本,包括CreateProcessAsUserElevated()ShellExecuteElevated()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2018-08-01
      • 2011-01-17
      • 2010-09-06
      • 2011-10-28
      相关资源
      最近更新 更多