Windows ユーザー アカウントが Admin グループにあり、UAC が有効で、通常のユーザー権限でプログラム A を実行しているとします。A は標高を要求することも、受け取ることもありません。ここで、A がマニフェストにhighestAvailable を持つプログラム B を起動したいとします。
A が CreateProcess(B) を呼び出すと、エラー 740 ("昇格が必要です") で失敗します。
A が ShellExecuteEx(B) を呼び出すと、Windows は B を管理者特権で実行するよう求める UAC ボックスを表示します。ユーザーは、B が管理者特権で実行される場合は [はい] と答えることができ、起動が失敗する場合は [いいえ] と答えることができます。
私の質問は、昇格せずに B を起動するだけの 3 番目のオプションを実現する方法はありますか?
「highestAvailable」は、B が高度で実行することを好むが、通常のユーザー モードで完全に実行できることを意味するため、これは原則として可能であるように思われます。しかし、私はそれを達成する方法を理解できません。私はトークンと CreateProcessAsUser() であらゆる種類のことを試しましたが、すべてこれに帰着するようです.構築されたトークン。
CreateProcessAsUser() を使用してこれを行う方法が実際にあることを願っています。トークンを適切に構築するためのトリックが欠けているだけです。
更新 - 解決済み:以下の __COMPAT_LAYER=RunAsInvoker ソリューションはうまく機能します。ただし、注意点が 1 つあります。これにより、サブプロセスが無条件に「実行者として」実行されます。呼び出される exe がそのマニフェストで「requireAdministrator」を指定している場合でも適用されます。exeが「requireAdministrator」を指定している場合、通常は元の「昇格が必要です」というエラーが望ましいと思います。「highestAvailable」とマークされたプログラムの RunAsInvoker 動作が必要だった理由は、そのようなプログラムが「どちらのモードでも適切に機能する」と明示的に言っているためです。管理モードを使用するのが不便な場合は、通常のユーザー モードで実行してみましょう。しかし、「requireAdministrator」は別の問題です。そのようなプログラムは、「昇格された特権なしでは適切に機能できない」と言っています。そのようなプログラムを昇格せずに強制的に実行するよりも、事前に失敗する方が良いようです。これにより、処理するように適切にプログラムされていない特権/アクセスエラーが発生する可能性があります。したがって、ここでの完全な汎用ソリューションには、アプリケーション マニフェストを確認し、マニフェストに「highestAvailable」と表示されている場合にのみ RunAsInvoker 強制を適用する必要があると思います。さらに完全な解決策は、他の場所で説明されている手法の 1 つを使用して、「requireAdministrator」プログラムが提示されたときに UAC を呼び出すオプションを発信者に提供し、ユーザーにそれを昇格して起動する機会を提供することです。CreateProcessEx() は、「プロセス特権を利用可能な最高の特権として扱う」および「昇格が必要な場合は UAC を呼び出す」ためのいくつかの新しいフラグでカバーされていると想像できます。
(おそらく、Windows シェルにはこれを行う方法さえ提供されていないことがわかります...シェルから B を直接起動すると、管理者権限で起動するか、まったく起動しないかを選択できる UAC ボックスが表示されます。どのような方法でそれを達成するにしても、UAC ボックスは特権なしで起動するための 3 つ目のボタンを提供するかもしれません.しかし、これも 3 つ目のオプションが民間人にとって混乱しすぎるという UX の決定である可能性があります.)
(StackOverflow および Microsoft 開発者サポート サイトには、残念ながらここでは当てはまらない非常によく似たシナリオについて質問する投稿が非常に多いことに注意してください。昇格されていない子プロセスを起動する. 標準的な例はインストーラーであり, インストーラーが行う傾向があるように昇格して実行され, インストールしたばかりのプログラムを終了する直前に通常のユーザーレベルで起動したい. についての投稿されたコードがたくさんあります.それを行う方法、および私はこれらの手法のいくつかに基づいて試みましたが、これは実際には別のシナリオであり、私の状況では解決策は機能しません.大きな違いは、起動しようとしている子プログラムこの場合はそうではありませんhighAvailable でマークされています - 子は、通常の状況で UAC の関与なしに起動する単なる通常のプログラムです。別の違いもあります。これらのシナリオでは、親は既に昇格して実行されていますが、私のシナリオでは、親は通常のユーザー レベルで実行されています。この他のシナリオの親プロセスは、A 自体が昇格されていないために使用できないトークンに対するいくつかの特権操作にアクセスできるため、状況が少し変わります。しかし、私が知る限り、これらの特権トークン操作はとにかく役に立たないでしょう。私のシナリオの重要な要素であるhighestAvailableフラグが子にあるという事実です.)