1. ホーム
  2. c#

[解決済み] 必要なときだけ特権を昇格させるには?

2023-06-25 04:35:36

質問

この質問は Windows Vista に当てはまります!

通常、管理者権限なしで動作するアプリケーションを持っています。管理者権限が必要なアクティビティが 1 つありますが、ほとんどの場合、ユーザーはその機能を使用しないことがわかっているので、より高い権限でアプリケーション自体を開始したくありません。

私は、あるイベント (ボタンを押すなど) でアプリケーションの特権を昇格させることができる、ある方法について考えています。例

ユーザーがこのボタンをクリックすると、UACダイアログまたは同意のプロンプトが表示されます。どうすればよいのでしょうか。

どのように解決するのですか?

現在実行中のプロセスを昇格させることは不可能だと思います。Windows Vista では、起動時にプロセスに管理者権限が与えられるように組み込まれていると私は理解しています。UAC を使用するさまざまなプログラムを見てみると、管理者アクションを実行する必要があるたびに、実際には別のプロセスが起動することがわかります (タスク マネージャーがその 1 つ、Paint.NET がその 1 つで、後者は実際には .NET アプリケーションです)。

この問題に対する典型的な解決策は、昇格プロセスを起動するときにコマンド ライン引数を指定し (abatishchev の提案はこれを行う 1 つの方法です)、起動したプロセスが特定のダイアログ ボックスを表示することしか知らず、このアクションが完了した後に終了するようにすることです。このため、新しいプロセスが起動され、終了したことはユーザーにはほとんど気づかれず、むしろ同じアプリ内で新しいダイアログボックスが開かれたように見えるはずです(特に、昇格プロセスのメインウィンドウを親プロセスの子プロセスにするハッキングを行った場合はそうなります)。昇格したアクセスに UI が必要ない場合は、なおさらです。

Vista での UAC の完全な議論については、以下を参照することをお勧めします。 この非常に分かりやすい記事 を参照することをお勧めします (コード例は C++ ですが、C# でほとんどのことを行うには WinAPI と P/Invoke を使用する必要があると思われます)。UAC 準拠のプログラムを設計するのは簡単ではありませんが、少なくとも取るべき正しいアプローチを理解していただけると幸いです...。