本文探讨了如何在启动应用程序时消除手动选择“以管理员身份运行”的需要,使其能够提示自动获取管理员权限。
问题源于无法无需提升权限即可写入 Windows 系统文件夹 (C:Windows)。运行提供的代码时,应用程序无法写入 test.txt 文件,并出现“访问被拒绝”错误。
要解决此问题,需要使用一种涉及 self-提出了以提升的权限重新启动应用程序。该技术采用以下方法:
1。检查管理员状态:
amAdmin() 函数通过尝试打开 .PHYSICALDRIVE0 设备来检查应用程序是否以管理员身份运行。如果授予访问权限,该函数返回 true;否则,返回 false。
2.以海拔重新启动:
如果 amAdmin() 返回 false,则执行 runMeElevated() 函数。此函数使用 Windows ShellExecute API 以提升的权限重新启动应用程序。它指定“runas”动词,提示用户获得管理员权限。
3.主函数执行:
主函数首先检查应用程序是否具有管理员权限。如果没有,它会调用 runMeElevated() 函数以管理员身份重新启动自身。如果应用程序已经以提升的权限运行,它将继续执行预期的代码。
代码示例:
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 }
通过实现此方法,应用程序将正常启动时自动提示管理员权限,无需通过右键菜单手动提升。
以上是如何在 Windows 中自动为我的 Go 应用程序请求管理员权限?的详细内容。更多信息请关注PHP中文网其他相关文章!