Go を使用して Windows で管理者権限をプログラム的に要求する
管理者権限なしでアプリケーションを実行すると、機能が制限される可能性があります。この記事では、Go を使用して Windows で管理者権限を要求および取得するプロセスを自動化するという課題に対する解決策を提供します。
この問題を説明するために、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) } }
このコードをコンパイルして実行すると、「アクセスが拒否されました」というエラーが発生して失敗します。これは、プロセスが昇格された特権で実行されていないためです。
この問題を解決するには、管理者として実行しているかどうかを検出し、管理者として実行していない場合は、UAC (ユーザー) を使用してアプリケーションを再起動する手法を実装できます。アカウント制御)プロンプトが表示されます。これにより、アプリケーションはほとんどの場合標準ユーザーとして実行され、必要な場合にのみ昇格することができます。
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 }
このソリューションは、必要に応じて、アプリケーションの権限を自動的に昇格させる便利な方法を提供します。マニフェスト、または右クリックして [管理者として実行] を選択するなどの手動のユーザー アクション。
以上がGo を使用して Windows で管理者特権をプログラム的に要求するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。