ホームページ >バックエンド開発 >Golang >Go を使用して Windows で管理者特権をプログラム的に要求するにはどうすればよいですか?

Go を使用して Windows で管理者特権をプログラム的に要求するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-08 20:37:02968ブラウズ

How to Programmatically Request Administrator Privileges in Windows with Go?

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 サイトの他の関連記事を参照してください。

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