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