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.
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é ».
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!