ホームページ  >  記事  >  バックエンド開発  >  Windows で Go アプリケーションの管理者権限を自動的に要求するにはどうすればよいですか?

Windows で Go アプリケーションの管理者権限を自動的に要求するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-08 05:34:01642ブラウズ

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

Go を使用した Windows での管理者権限の要求

この記事では、アプリケーションの起動時に「管理者として実行」を手動で選択する必要をなくし、アプリケーションの起動を有効にする方法について説明します。管理者権限が自動的に付与されます。

問題の説明:

質問の原因は次のとおりです。昇格された特権がないと 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。