首頁 > 後端開發 > Golang > 主體

如何使用 Go 以程式設計方式在 Windows 中請求管理員權限?

Linda Hamilton
發布: 2024-11-08 20:37:02
原創
960 人瀏覽過

How to Programmatically Request Administrator Privileges in Windows with Go?

使用Go 在Windows 中以程式設計方式請求管理員權限

在沒有管理權限的情況下執行應用程式可能會限制其功能。本文提供了一個解決方案,以應對使用 Go 在 Windows 中自動請求和取得管理員權限的過程的挑戰。

為了說明問題,請考慮以下嘗試寫入Windows 目錄中的檔案的程式碼:

package main

import (
    "fmt"
    "io/ioutil"
    "time"
)

func main() {
    err := ioutil.WriteFile("C:/Windows/test.txt", []byte("TESTING!"), 0644)
    if err != nil {
        fmt.Println(err.Error())
        time.Sleep(time.Second * 3)
    }
}
登入後複製

如果編譯並執行此程式碼,它將失敗並顯示錯誤「存取被拒絕」。這是因為該進程未以提升的權限運行。

要解決此問題,您可以實作一種技術來偵測您是否以管理員身分執行,如果不是,請使用 UAC(使用者帳戶控制)提示。這將允許應用程式在大多數時間以標準用戶身份運行,僅在必要時提升。

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
}
登入後複製

此解決方案提供了一種方便的方法,可以在必要時自動提升應用程式的權限,而不需要清單或任何手動使用者操作,例如右鍵單擊並選擇「以管理員身份運作」。

以上是如何使用 Go 以程式設計方式在 Windows 中請求管理員權限?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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