8

UACと特権の昇格に関するいくつかの質問を読みましたが、満足のいく/包括的な答えは見つかりませんでした。

このシナリオがあります。Windows6以降では、ユーザーが構成ウィンドウを開いたときに、タスクを完了するために特権の昇格が必要な場合にのみBCM_SETSHIELD、[OK]ボタンにシールド()を表示する必要があります。--Windows UIでは、UACが無効になっている場合でも、「管理タスク」のシールドが常に視覚化されていることを知っていますが、顧客からこの特定の要求がありました。

アイコンを表示するために、この条件をドラフトしました。

  1. ユーザーに管理者権限がない、
    または
  2. 現在のプロセスにはTOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

条件#1は単純です。ユーザーが管理者権限を持っていない場合は、UACに関係なく常に昇格が必要です。#2は、ユーザーが管理者権限を持っていることを意味し、その他の値はTOKEN_ELEVATION_TYPE昇格が不要であることを意味します。

本当に簡単ですか?私は何かが足りないのですか?そして-このトピックに関して文書化された、またはよく知られているパターンはありますか?

4

2 に答える 2

3

あなたが正しいです。ほとんどの人は、ボタンが上昇して実行される場合はシールドを装着するだけですが、ボタンが上昇する場合はシールドを装着するのが正しいことです(つまり、すでに上昇している場合は、起動するすべてのものが上昇したままになるため、シールドを抑制します)昇格されていないプロセスを起動するために何らかの問題が発生した場合を除き、UACがオフの場合はそれを抑制します。)

幸いなことに、Administratorsグループの誰かが(UACの下で)昇格されていないアプリケーションを実行しfalseている場合、管理者かどうかを尋ねると戻ってきます。だから私はあなたがその1つのテストだけで大丈夫かもしれないと思います。

于 2010-06-26T19:25:01.690 に答える
2

このトピックについては多くの混乱があり、ここでのケイトからの回答は正しくなく、不完全であることがわかります。

Vista以降、管理者はログインできますが、彼のプロセスは自動的に昇格して実行されません。管理者は、いわゆる「スプリットトークン」を持っています。これは、同じ管理者ユーザーに対して実行されているプロセスが存在する可能性があり、一部のプロセスは昇格して実行され、その他のプロセスは昇格して実行されないことを意味します。管理者が昇格されていないプロセスを実行すると、彼のトークンの特権の一部が削除されました。すべてのプロセスが昇格または昇格せずに実行されるXPの場合とは異なります。

www.sysinternals.comからProcessExplorerをインストールし、「IntegrityLevel」列を有効にします。「中」と表示されている場合、このプロセスは昇格して実行されません。そこに「高」が表示されている場合、プロセスは高架で実行されます。プロセスが整合性レベル「高」で実行されている場合、昇格された別のプロセスを開始するためにUACプロンプトは必要ありません。

UACが完全にオフになると、すべてのプロセスが「高」で実行されるため、昇格は必要ありません。UACは下でオフにすることができます

HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System

キー" EnableLUA"を設定します。この設定を変更するには、再起動する必要があります。

しかし、ここでまだ言及されていない別のポイントがあります。コントロールパネルでは、「プロンプトなしで昇格」を設定できます。この場合、管理者ユーザーは昇格されていない別のプロセスから昇格されたプロセスを開始でき、UACプロンプトは表示されません。

ConsentPromptBehaviorAdminこの設定は、管理者ユーザーのキー""の同じレジストリパスに保存されます。

管理者以外のすべてのユーザーにはキー" ConsentPromptBehaviorUser"がありますが、これは動作のみを変更しますが、高度をオフにすることはできません。非管理者は常にUACプロンプトを受け取ります。(UACが完全にオフになっていない場合)

プロセスが昇格して実行されているかどうかをどのように確認しますか:、、、、OpenProcess()の順OpenProcessToken()に呼び出しGetTokenInformation(TokenElevation)ます。

そして、整合性レベルの呼び出しを取得してGetTokenInformation(TokenIntegrityLevel)からGetSidSubAuthority()

したがって、昇格が本当に必要な場合にのみアイコンを表示する場合は、プロセスが昇格して実行されているかどうかを確認し、さらにこれらのレジストリキーを確認し、ユーザーが管理者であるかどうかを確認する必要があります。これには数行のコードが含まれ、単純にするために標高必要な場合は常にこのアイコンを表示することを検討します。

IsUserAnAdmin()APIは非推奨であることに注意してください。Vista以降は使用しないでください。ユーザーが管理者グループに属しているかどうかを確認することは、今でははるかに多くのコードです。

于 2015-08-19T15:51:41.973 に答える