Heim >Backend-Entwicklung >Golang >Wie kann ich mit Go programmgesteuert Administratorrechte in Windows anfordern?

Wie kann ich mit Go programmgesteuert Administratorrechte in Windows anfordern?

Linda Hamilton
Linda HamiltonOriginal
2024-11-08 20:37:02968Durchsuche

How to Programmatically Request Administrator Privileges in Windows with Go?

Programmgesteuert Administratorrechte in Windows mit Go anfordern

Das Ausführen von Anwendungen ohne Administratorrechte kann deren Funktionalität einschränken. Dieser Artikel bietet eine Lösung für die Herausforderung, den Prozess des Anforderns und Erhaltens von Administratorberechtigungen in Windows mithilfe von Go zu automatisieren.

Um das Problem zu veranschaulichen, betrachten Sie den folgenden Code, der versucht, in eine Datei im Windows-Verzeichnis zu schreiben:

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

Wenn Sie diesen Code kompilieren und ausführen, schlägt er mit der Fehlermeldung „Zugriff verweigert“ fehl. Dies liegt daran, dass der Prozess nicht mit erhöhten Rechten ausgeführt wird.

Um dieses Problem zu beheben, können Sie eine Technik implementieren, die erkennt, ob Sie als Administrator ausgeführt werden, und andernfalls die Anwendung mit einem UAC (Benutzer) neu startet Eingabeaufforderung zur Kontosteuerung. Dadurch kann die Anwendung die meiste Zeit als Standardbenutzer ausgeführt werden und nur bei Bedarf erhöht werden.

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
}

Diese Lösung bietet eine praktische Möglichkeit, die Berechtigungen Ihrer Anwendung bei Bedarf automatisch zu erhöhen, ohne dass ein Manifest oder eine manuelle Benutzeraktion wie Rechtsklick und Auswahl von „Als Administrator ausführen“

Das obige ist der detaillierte Inhalt vonWie kann ich mit Go programmgesteuert Administratorrechte in Windows anfordern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn