この記事では、アプリケーションの起動時に「管理者として実行」を手動で選択する必要をなくし、アプリケーションの起動を有効にする方法について説明します。管理者権限が自動的に付与されます。
質問の原因は次のとおりです。昇格された特権がないと Windows システム フォルダー (C:Windows) に書き込むことができません。提供されたコードを実行すると、アプリケーションは「アクセスが拒否されました」エラーで test.txt ファイルへの書き込みに失敗します。
この問題に対処するには、自己昇格された特権でアプリケーションを再起動することが表示されます。この手法では、次のアプローチを利用します。
1.管理者ステータスの確認:
amAdmin() 関数は、.PHYSICALDRIVE0 デバイスを開こうとすることで、アプリケーションが管理者として実行されているかどうかを確認します。アクセスが許可された場合、関数は true を返します。それ以外の場合は false を返します。
2.昇格による再起動:
amAdmin() が false を返す場合、runMeElevated() 関数が実行されます。この関数は、Windows ShellExecute API を使用して、昇格された特権でアプリケーションを再起動します。ユーザーに管理者の許可を求める「runas」動詞を指定します。
3. Main 関数の実行:
main 関数は、まずアプリケーションに管理者権限があるかどうかを確認します。そうでない場合は、runMeElevated() 関数を呼び出して、管理者として自身を再起動します。アプリケーションが既に昇格された特権で実行されている場合、アプリケーションは目的のコードの実行に進みます。
コード サンプル:
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 }
このメソッドを実装すると、アプリケーションは通常の起動時に管理者権限を求めるプロンプトが自動的に表示されるため、右クリック メニューから手動で昇格する必要がなくなります。
以上がWindows で Go アプリケーションの管理者権限を自動的に要求するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。