Maison  >  Article  >  développement back-end  >  Comment puis-je demander automatiquement les privilèges d'administrateur pour mon application Go sous Windows ?

Comment puis-je demander automatiquement les privilèges d'administrateur pour mon application Go sous Windows ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-08 05:34:01642parcourir

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

Demande de privilèges d'administrateur dans Windows avec Go

Cet article explique comment éliminer le besoin de sélectionner manuellement « Exécuter en tant qu'administrateur » lors du lancement d'une application, lui permettant ainsi de demander pour les autorisations d'administrateur automatiquement.

Description du problème :

La question découle de l'impossibilité d'écrire dans un dossier système Windows (C:Windows) sans privilèges élevés. Lors de l'exécution du code fourni, l'application ne parvient pas à écrire dans le fichier test.txt avec une erreur « L'accès est refusé ».

Solution :

Pour résoudre ce problème, une méthode impliquant l'auto- la relance de l'application avec des privilèges élevés est présentée. Cette technique utilise l'approche suivante :

1. Vérification du statut d'administrateur :

La fonction amAdmin() vérifie si l'application s'exécute en tant qu'administrateur en essayant d'ouvrir le périphérique .PHYSICALDRIVE0. Si l'accès est accordé, la fonction renvoie true ; sinon, il renvoie faux.

2. Relance avec Elevation :

Si amAdmin() renvoie false, la fonction runMeElevated() est exécutée. Cette fonction utilise l'API Windows ShellExecute pour relancer l'application avec des privilèges élevés. Il spécifie le verbe "runas", qui demande à l'utilisateur l'autorisation d'administrateur.

3. Exécution de la fonction principale :

La fonction principale vérifie d'abord si l'application dispose de privilèges d'administrateur. Dans le cas contraire, il invoque la fonction runMeElevated() pour se relancer en tant qu'administrateur. Si l'application s'exécute déjà avec des privilèges élevés, elle procède à l'exécution du code prévu.

Exemple de code :

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
}

En implémentant cette méthode, l'application demande automatiquement l'autorisation de l'administrateur lors d'un lancement normal, éliminant ainsi le besoin d'élévation manuelle via le menu contextuel.

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!

Déclaration:
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