Maison > développement back-end > Golang > Comment demander par programme des privilèges d'administrateur dans Windows avec Go ?

Comment demander par programme des privilèges d'administrateur dans Windows avec Go ?

Linda Hamilton
Libérer: 2024-11-08 20:37:02
original
1008 Les gens l'ont consulté

How to Programmatically Request Administrator Privileges in Windows with Go?

Demander par programmation des privilèges d'administrateur dans Windows avec Go

L'exécution d'applications sans privilèges administratifs peut limiter leurs fonctionnalités. Cet article fournit une solution au défi de l'automatisation du processus de demande et d'obtention des autorisations d'administrateur dans Windows à l'aide de Go.

Pour illustrer le problème, considérons le code suivant qui tente d'écrire dans un fichier du répertoire 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)
    }
}
Copier après la connexion

Si vous compilez et exécutez ce code, il échouera avec l'erreur "L'accès est refusé". En effet, le processus ne s'exécute pas avec des privilèges élevés.

Pour résoudre ce problème, vous pouvez implémenter une technique qui détecte si vous exécutez en tant qu'administrateur et, sinon, relance l'application avec un UAC (User Contrôle de compte). Cela permettra à l'application de s'exécuter en tant qu'utilisateur standard la plupart du temps, en l'élevant uniquement lorsque cela est nécessaire.

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
}
Copier après la connexion

Cette solution offre un moyen pratique d'élever automatiquement les privilèges de votre application lorsque cela est nécessaire, sans avoir besoin d'un manifeste ou toute action manuelle de l'utilisateur comme un clic droit et la sélection de « Exécuter en tant qu'administrateur ».

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal