【发布时间】:2014-11-21 23:18:37
【问题描述】:
有没有办法在 Go 中将新进程或线程提升为管理员?
似乎 ShellExecute() 在 Go 中不可用,并且无法使用 CreateProcess() 进行提升。我不知道还有什么可能。
【问题讨论】:
有没有办法在 Go 中将新进程或线程提升为管理员?
似乎 ShellExecute() 在 Go 中不可用,并且无法使用 CreateProcess() 进行提升。我不知道还有什么可能。
【问题讨论】:
您可以尝试检查项目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)
}
}
【讨论】:
SE_ERR_DDEBUSY: Claude 会同意的。
CreateProcess()不支持运行提升的进程,但是下面的文章中有一个第三方的CreateProcessElevated()函数可以:
Vista UAC: The Definitive Guide
它还提供了其他几个函数的提升版本,包括CreateProcessAsUserElevated() 和ShellExecuteElevated()。
【讨论】: