首頁 > 後端開發 > Golang > 如何在 Windows 中自動為我的 Go 應用程式請求管理員權限?

如何在 Windows 中自動為我的 Go 應用程式請求管理員權限?

Linda Hamilton
發布: 2024-11-08 05:34:01
原創
742 人瀏覽過

How can I automatically request administrator privileges for my Go application in Windows?

使用Go 在Windows 中請求管理員權限

本文探討瞭如何在啟動應用程式時消除手動選擇「以管理員身份運行」的需要,使其能夠提示自動取得管理員權限。

問題描述:

問題源自於無法無需提升權限即可寫入 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板