次の方法で共有


4.3 ユーザー アカウント制御 (UAC: User Account Control)

4. 新機能や機能変更に伴う互換性問題

この章では、以下のような新機能や機能変更に伴う、互換性問題について紹介します。

セキュリティに関する問題点

ここ数年の間に、Windows を狙ったウイルスやワームが増加しました。こうした攻撃のために、企業や家庭のコンピューターを使用するユーザーは、修復に膨大な時間や費用を費やしました。スパイウェアなどの悪意のあるソフトウェア (マルウェア) は 、疑いを持たないユーザーによってインストール、起動されることもあります。これらは、有用で一見害のないソフトウェアに潜んでいることがあるからです。

管理者としてログオンしているときに悪意のあるコードが実行されると、被害が大きくなります。これは、管理者特権で悪意のあるコードが実行されてしまうからです。たとえば、管理者としてログオンしていると、ブラウザーや電子メールクライアントなどのアプリケーションも、管理者権限を持つことになります。これらのアプリケーションが悪意のあるソフトウェアを起動すると、悪意のあるソフトウェアは、それ自体をインストールし、ウイルス対策ソフトウェアを操作して OS から見えなくすることさえできてしまいます。そして、セキュリティ侵害されたサイトにアクセスしたり、電子メールのリンクをクリックしたりすることで、ユーザーが意図していないにもかかわらず、悪意のあるソフトウェアが実行されてしまう可能性があります。

ページのトップへ


Windows XP での対策と問題点

この脅威に対抗するため、Windows XP では、LUA (Least-privileged User Account) を採用しました。LUA アプローチでは、管理者は 2 つのユーザー アカウントを使い分けます。つまり、管理者といえども、ブラウザーや電子メール クライアントなどを利用するときには、「制限付きユーザー アカウント」を使います。そして、ディスク操作やユーザー作成などの管理作業をおこなうときには、「管理者ユーザー アカウント」を利用します。

この方法は、管理者が管理タスクをおこなうときに、ログオンしなおさなければなりません。そのわずらわしさのため、結局は「常に管理者ユーザーでログオンする」という状況を生む結果となりました。また、管理者権限でないと正常に動作しないアプリケーションが多いことも、この状況に拍車をかけてしまいました。

制限付きユーザー アカウントとは、権限が制限されていて、偶発的または故意によるシステム全体への変更が許可されていないユーザー アカウントです。最小限の権限しか持っていないため、攻撃によるシステムへの影響が少ないアカウントといえます。具体的には、ローカル コンピュータの Users グループのメンバーです。また、ドメインに参加しているコンピューターでは、Domain Users グループのユーザー アカウントは、既定でローカル コンピュータの Users グループのメンバーに含まれます。

ページのトップへ


UAC の目的と特徴

Windows Vista や Windows 7 では、LUA の代わりに、UAC (User Account Control: ユーザー アカウント制御) 権限モデルを採用しています。UAC は、LUA 同様、ユーザーが意図しないコードが実行されないようにします。しかし、使い勝手が大幅に改善されています。以下に UAC の特徴を挙げます。

  • 管理者は 2 つのユーザー アカウントを使い分ける必要がない

    1 つのユーザー アカウントに、通常のユーザーとしての役割と、管理者としての役割を与えることができます。そのため、ログイン、ログアウトを繰り返す必要はありません。管理者は、常に管理権限のある 1 人のユーザーでログオンでき、しかも安全にアプリケーションを実行することができます。

  • プロセスを分離可能

    UAC では、プロセス単位で実行するユーザーの権限を変えることができます。管理権限が必要なコードをメインのアプリケーションと切り分ければ、アプリケーション全体を管理者で実行しなくてもよいため、より安全な環境を提供することができます。

  • シームレスな遷移が実現される

    管理者特権が必要になると、管理者として実行するかどうかを確認する画面が表示されます。この画面で承認すれば、自動的に管理者として実行されます。

UAC はコントロール パネルの設定により、無効にすることもできます。しかし無効にすることでセキュリティ上のメリットがなくなってしまうため、推奨されません。

ページのトップへ


UAC のしくみ

Windows Vista や Windows 7 では、管理者を含む全てのユーザーは、既定で「標準ユーザー」としてアプリケーションを実行します。「標準ユーザー」とは Users グループのユーザーです。標準ユーザーが実行するプロセスは「中 IL」の整合性レベルが使用されるため、システム領域のリソースへのアクセスが制限されます。

管理者権限が必要なアプリケーションやタスクを実行する際は、標準ユーザーでは権限が足りません。そこで、管理権限が必要な場合には、図 4-2 のような「承認ユーザー インターフェイス」を表示します。このダイアログボックスで「はい」ボタンをクリックすると、管理者に「昇格」され、そのアプリケーションやタスクは、管理者権限で実行されることになります。昇格により実行されるプロセスは「高 IL」の整合性レベルが使用されるため、システム領域のリソースへのアクセスも可能です。

図 4-2: 承認ユーザー インターフェイス

図 4-2: 承認ユーザー インターフェイス

権限の昇格を実現するために、ログオン時にユーザーのトークンを「フルトークン」と「フィルター済みトークン」に分割します。そして、いずれかのトークンがアプリケーションに渡されます。

ユーザーや所属するグループ、保持している特権などの情報により、ユーザーをあらわしたものです。システムはトークンを使用して、セキュリティで保護されたオブジェクトへのアクセスや、システム関連の操作を実行する権限を制御します。

「フルトークン」は、ユーザーが保持している全ての権限が定義されているトークンです。一方、「フィルター済みトークン」は、ユーザーが保持している全ての権限のうち、標準ユーザーが持つものだけを定義したトークンです。「フィルター済みトークン」では管理作業はおこなえません。

既定では、全てのユーザーは、「フィルター済みトークン」でアプリケーションを実行します。管理者としてログオンしている場合も例外ではありません。そして、管理権限が必要になった場合には、図 4-2 のような「承認ユーザー インターフェイス」が表示され、「はい」ボタンをクリックすると、権限が昇格されフルトークンで動作します。

ビルトインの Administrator ユーザーは、はじめから管理者権限で全てのアプリケーションが実行されます。そのため、「昇格」の必要はありません。ただし、既定では、Administrator ユーザー アカウントは無効になっています。

図 4-3: Administrator は既定では無効

図 4-3: Administrator は既定では無効

管理者としてログオンしていて、権限の昇格が必要になると、図 4-2 のような「承認ユーザー インターフェイス」が表示されます。ここで「はい」ボタンをクリックすることで、そのアプリケーションやタスクがフルトークンで実行されることになります。「キャンセル」ボタンをクリックした場合には、昇格はおこなわれません。

一方、標準ユーザーなどでログオンしている場合には、昇格が必要になると、図 4-4 のような「資格情報ユーザー インターフェイス」が表示されます。このダイアログボックスでは、管理者の資格情報を入力できます。これにより、標準ユーザーでログオンしていても、特定のタスクだけ管理者で実行することができます。

図 4-4: 資格情報ユーザー インターフェイス

図 4-4: 資格情報ユーザー インターフェイス

また、どちらのダイアログボックスの場合にも、タイトルバーのすぐ下の帯の色に注目する必要があります。この色は、アプリケーションの発行元によって色が変わります。

帯の色 アプリケーションの発行元
OS が提供するアプリケーション
署名つきのアプリケーション (Windows Vista ではグレー)
署名なしのアプリケーション
ブロックされている発行元から提供されたアプリケーション

盾アイコンとは

昇格が必要なアプリケーションやタスクには、図 4-5 のような「盾」が表示されます。

図 4-5: 盾アイコン

図 4-5: 盾アイコン

図 4-6 のようにファイルのアイコン自体に盾が含まれる場合は、アプリケーションを起動しようとしたタイミングで、昇格するための「承認ユーザー インターフェイス」ダイアログが表示されます。そして、アプリケーション全体が管理者権限で実行されます。

図 4-6: 盾が含まれているファイルのアイコン

図 4-6: 盾が含まれているファイルのアイコン

これに対し、一部のタスクでのみ昇格を必要とする場合は、図 4-7 のように、ボタンなどに盾アイコンが表示されます。ここで盾アイコンの付いたボタンをクリックすると、「承認ユーザー インターフェイス」ダイアログが表示され、そのタスクのみが管理者権限で実行されます。

図 4-7: 盾が含まれているボタン

図 4-7: 盾が含まれているボタン

いずれの場合にも、管理者権限で実行されるのは、そのアプリケーションやタスクのみです。それ以外のアプリケーションやタスクは、標準ユーザーのまま実行されます。

盾アイコンの目的は、盾アイコンの付いた操作を実行すると特権の昇格が必要になることを、一目でわかるようにすることです。ユーザーは、盾アイコンの付いたアイテムをクリックすると、権限の昇格が求められることを予測できます。

UAC を無効にしていたり、ユーザーが組み込みの Administrator アカウントを使用していたりする場合は、昇格の必要はありませんが、盾アイコンは表示されます。また、盾アイコンには、1 つの状態しかありません。盾アイコンが無効になったり、カーソルを合わせたときに外観が変わったり、選択された状態になったりすることはありません。

開発者は、クリックするとその操作が特権の昇格を必要とするコントロールに、容易に盾アイコンを付けることができます。詳細はこの節の「UAC 対応アプリケーションを新規に作成するには」を参照してください。

できる限り、標準ユーザーが昇格なしで実行できるようにプログラムを設計します。標準ユーザーの生産性を十分に確保し、初期配置後に管理操作をおこなう必要がないように製品を設計します。

管理権限が必要な既存のアプリケーションを実行する場合は、アプリケーションの起動時に昇格する必要があります。そのためには、以下の 4 つの方法がありますが、これらはいずれも Windows Vista や Windows 7 での設定を必要とするだけで、アプリケーション自体を変更する必要がありません。

アプリケーションを起動する際、アイコンやスタート メニューを右クリックし、コンテキスト メニューから「管理者として実行」を選択します。

これにより昇格し、そのアプリケーションは、管理者権限で実行されます。

図 4-8: [管理者として実行] コンテキスト メニュー

図 4-8: [管理者として実行] コンテキスト メニュー

アプリケーションのプロパティを開き、[互換性] タブで、「管理者としてこのプログラムを実行する」を選択します。これにより、常に管理者権限で実行することができます。この方法は、各コンピューターで設定できるので、ユーザー向けといえます。

図 4-9: [互換性] タブ

図 4-9: [互換性] タブ

企業内の多数のコンピューターに適用するためには、Compatibility Administrator ツールを使用して、互換フィックスを適用します。利用可能な互換フィックスは以下のとおりです。

互換フィックス 説明
RunAsUAC 親プロセスと同じ権限で動作
RunAsHighest ユーザーが取得できる最高レベルの権限で動作
RunAsAdmin 管理者権限で動作
ElevateCreateProcess ERROR_ELEVATION_REQUIRED を処理

Compatibility Administrator についての詳細は、「5.2 Compatibility Administrator」を参照してください。

アプリケーション マニフェストを作成することで、アプリケーション開発者が昇格を要求することができます。アプリケーション マニフェストの詳細については、この節の「アプリケーション マニフェストの作成」を参照してください。

ページのトップへ


Windows 7 での変更点 Windows 7 Only

UAC はセキュリティを高めるための機能なので、その機能を無効にしてしまうことは推奨されません。ただ、Windows Vista では、すべての管理作業で権限昇格ダイアログが表示されるため、煩わしさを感じるユーザーが多かったことも確かです。
そこで、Windows 7 では、UAC のセキュリティ レベルを 4 段階の中から選択できるようになっています。これは、コントロール パネルで [システムとセキュリティ]-[アクションセンター]-[ユーザー アカウント制御設定の変更] で設定できます。

図 4-10: ユーザー アカウント制御設定の変更

図 4-10: ユーザー アカウント制御設定の変更

設定 説明
常に通知する 常に UAC の通知をおこないます。これは、 Windows Vista で UAC が有効な時と同じ動作です。
プログラムがコンピューターに変更を加えようとする場合のみ通知する

アプリケーションがソフトウェアをインストールしようとしたり、コンピューターに変更を加えようとしたりした場合に、 UAC のダイアログを表示します。

ただし、Windows が提供するアプリケーションでは、UAC のダイアログを表示することなく昇格します。 UAC のダイアログの表示時には、デスクトップ全体を薄暗くし、他のアプリケーションを操作することができなくなります。

Windows 7 はこれが既定値です。

プログラムがコンピューターに変更を加えようとする場合のみ通知する (デスクトップを暗転しない)

アプリケーションがソフトウェアをインストールしようとしたり、コンピューターに変更を加えようとしたりした場合に、 UAC のダイアログを表示します。

ただし、Windows が提供するアプリケーションでは、UAC のダイアログを表示することなく昇格します。

UAC のダイアログの表示時には、デスクトップ全体を薄暗くしないため、他のアプリケーションを引き続き操作することができます。

通知しない

常に UAC の通知をおこないません。これは、Windows Vista で UAC が無効の時と同じです。

セキュリティ上の理由から、この設定は推奨されません。

ページのトップへ


UAC 対応アプリケーションを新規に作成するには

新規に作成するアプリケーションは、UAC を考慮して開発します。そして、ユーザーが特別な操作をしなくても、必要に応じて権限を昇格できるようにします。

まずは、標準権限で動作できるようにすることを優先します。標準権限で実行できるようにするためには、特に以下の点に注意します。

  • アプリケーションの実行に必要な情報をファイルに保存するときは、適切な場所を指定します。Windows Vista や Windows 7 では、マシン全体のデータと、ユーザーごとのデータの保存先が明確に区別されています。標準ユーザーは、システム用の領域には書き込みできません。また、他のユーザーのプロファイルにもアクセスすることはできません。詳細は、4.1 「リソース管理」を参照してください。
  • レジストリへの書き込みをおこなっている場合には、それが適切な場所かどうかを確認します。「HKEY_LOCAL_MACHINE」への書き込みは、管理者権限が必要です。
  • ユーザーごとの処理は、インストールが終了した後におこなうようにします。インストールは権限の昇格のために、別のユーザーでおこなわれている可能性があります。ユーザーごとの設定が必要なときは、各ユーザーの初回起動時におこないます。
  • Microsoft Windows Installer 3.1 以降に対応したインストーラーを使用します。MSI 3.1 以降のバージョンは、UAC を意識したものになっています。標準権限でのアプリケーションの更新も可能です。

アプリケーションを検証し、昇格が必要かどうかを確認します。これを確認するための最も分かりやすい方法は、標準ユーザーでアプリケーションを実行してみることです。ただ、このやり方は、バグを 1 つずつ見つけて修正していく必要があるため、時間がかかる可能性があります。

そこで、「Standard User Analyzer」ツールを使用すると、特権に関する問題を予測・診断することができます。このツールは、ACT (Application Compatibility Toolkit) に含まれています。Standard User Analyzer の使用方法は、以下のとおりです。

  1. スタートメニューから、[Standard User Analyzer] を起動します。
  2. [App Info] タブの [Target Application] で、分析したいアプリケーションのディレクトリを指定します。
  3. アプリケーションのパラメーターが必要な場合は、[Parameters] を設定します。
  4. [Launch Elevated] チェックボックスを選択し、[Launch] ボタンをクリックします。

    図 4-11: Standard User Analyzer の設定画面

    図 4-11: Standard User Analyzer の設定画面

  5. 「ユーザー アカウント制御」ダイアログ ボックスが表示されたら、[はい] をクリックします。
  6. ターゲット アプリケーションに対する「ユーザー アカウント制御」ダイアログ ボックスで、管理者の資格情報を指定し、[はい] ボタンをクリックします。
  7. Standard User Analyzer は、アプリケーションを起動し、処理の監視を開始します。ここで、テスト項目に従い、アプリケーションを操作します。操作が終了したらアプリケーションを終了します。
  8. Standard User Analyzer により、アプリケーションのログを生成して解析します。(完了には時間がかかる場合があります)

    ログが生成され、解析されたら、各タブをクリックして発見された問題を確認します。

    図 4-12: Standard User Analyzer の解析結果

    図 4-12: Standard User Analyzer の解析結果

作成するプログラムが、どんなユーザーをターゲットにしているのかを考えます。アプリケーションが一般ユーザー向けのものであるならば、全ての機能が標準ユーザーで動作するよう、作られていなければなりません。一方、管理者を対象としたアプリケーションで、ほぼ全ての操作に管理者権限が必要ならば、全てのコードが管理者権限で実行されるようにすることが考えられます。標準ユーザーで実行するコードと、管理者権限で実行するコードが混在する場合には、プログラムを分割することを考えます。そして、管理者権限を必要とするプログラムのみを昇格するようにすれば、一部だけ管理者権限で実行するアプリケーションを作成することができます。

ただし、プロセスのトークンは起動時に決定し、変更することはできません。そのため、管理者権限で実行するためには、分離したプロセスを、以下のいずれかの方法を使用して、メインのアプリケーションから呼び出します。

  • ShellExecute() もしくは ShellExecuteEx() を使用して、親プログラムから起動する

    ShellExecute() もしくは ShellExecuteEx() を使用して分割したプログラムを呼び出します。CreateProcess() では権限の昇格ができないため、「ERROR_ELEVATION_REQUIRED」が返されます。

  • COM オブジェクトとして分離する

    COM オブジェクトを作成するときに、COM 昇格モニカを使用して実行するオブジェクトのインスタンスを作成します。これにより、作成したオブジェクトは昇格したプロセスでホストされます。

COM 昇格モニカについては、以下の MSDN サイトに「CoCreateInstanceAsAdmin()」(英語) という名前でサンプルコードが紹介されています。

盾アイコンは、特権の昇格が必要となることをユーザーに知らせることを目的としています。この盾アイコンは、以下の 4 種類のアイテム上に表示することができます。

  • アイコン

    ファイルのアイコンに盾を表示することができます。アプリケーション マニフェストの「requestedExecutionLevel」の設定が、「requireAdministrator」となっている場合に自動的に盾が表示されます。そのため、アプリケーション開発者がコードから制御したりすることはできません。

    図 4-13: 盾アイコンの表示されたアイコン

    図 4-13: 盾アイコンの表示されたアイコン

  • Button/Hyperlink/Commandlink

    Windows Vista や Windows 7 では、Button や Hyperlink、Commandlink などのコントロールが拡張されており、盾アイコンを表示することができるようになっています。そのためには、以下のコードのように、BCM_SETSHIELD メッセージをボタンに送信します。その際に LPARAM を TRUE にするとアイコンが表示され、FALSE にするとアイコンが非表示になります。

    SendMessage(hwndButton, BCM_SETSHIELD, 0, TRUE);

    また、commctrl.h にマクロが定義されているため、以下のコードでも盾アイコンを表示することができます。

    Button_SetElevationRequiredState(hwndButton, true);

    いずれの場合にも 盾アイコンの表示は、単にアイコンがついているにすぎないため、権限を昇格して実行するためには、呼び出し先の exe などでマニフェストを設定する必要があります。

図 4-14: 盾アイコンの表示されたコントロール

図 4-14: 盾アイコンの表示されたコントロール

昇格を必要とするアプリケーションでは、アプリケーション マニフェストに管理者権限が必要であることを定義します。Windows Vista や Windows 7 では、アプリケーション マニフェストの属性が拡張されていて、「requestedExecutionLevel」要素を使用することで、アプリケーションの実行に必要な権限レベルを設定することができます。「level」属性で設定できる値は以下のとおりです。

            <requestedExecutionLevel level="asInvoker" />
          
説明
asInvoker 親プロセスと同じ権限で動作
highestAvailable ユーザーが取得できる最高レベルの権限で動作
requireAdministrator 管理者権限で動作

次に、以下の 3 種類のうちのいずれかの方法でアプリケーション マニフェストを作成します。

Windows XP SP2 で、「requestedExecutionLevel」などの Windows Vista の拡張機能を持つマニフェストを .exe ファイルまたは .dll ファイルに追加すると、コンピューターが再起動することがあります。この問題に関しては、修正プログラムが提供されています。詳細は、「Windows XP Service Pack 2 (SP2) で Windows Vista の拡張機能を持つマニフェストを .exe ファイルまたは .dll ファイルに追加するとコンピュータが再起動することがある」のサイトを参照してください。

埋め込みマニフェストを作成する

アプリケーション マニフェストを、アプリケーション ファイル (exeや dll など) とは別に、Xml 形式のファイルで提供する方法です。アプリケーションと同じディレクトリに、「アプリケーション名.exe.manifest」という名前で保存すると、アプリケーションの起動時に、マニフェスト ファイルが自動的に読み込まれます。

ただし、この情報はキャッシュされているため、一度実行した後でマニフェスト ファイルを配置すると、マニフェストが有効にならないことがあります。更新されない場合には、以下のいずれかの対応をとる必要があります。

  1. 不定期のキャッシュの更新を待つ
  2. プログラムをリビルドする
  3. プログラムのパスを変える (別のフォルダーにコピーするなど)

以下に具体的な手順を示します。

  1. テキスト エディタなどでマニフェストを作成します。ファイル名は「アプリケーション名.exe.manifest」にしなければなりません。以下はマニフェストの例です。「level="requireAdministrator"」を設定することで、管理者権限を要求しているのが分かります。
            <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
	manifestVersion="1.0">
	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
	<security>
		<requestedPrivileges>
		<requestedExecutionLevel
		level="requireAdministrator"/>
		</requestedPrivileges>
	</security>
	</trustInfo>
</assembly>
          
  1. 手順 1 で作成したファイルを、アプリケーションと同じディレクトリに保存します。
  2. アプリケーションを実行します。実行時に PE (Portable Executable) イメージにマニフェストが自動的に埋め込まれます。その結果、起動時に権限の昇格が求められます。

mt.exe コマンドを使用すると、アプリケーションをビルドした後に、アプリケーション マニフェストを埋め込むことができます。使用方法は以下の通りです。
mt.exe –manifest マニフェスト ファイル パス –outputresource: アプリケーション パス

・C/C++ プロジェクトでマニフェストを作成するには

アプリケーション マニフェストを、アプリケーション ファイル (exe など) に埋め込む方法です。Visual Studio 2008 の GUI 環境を利用して設定することができます。

  1. Visual Studio 2008 でプロジェクトを作成します。
  2. プロジェクトのプロパティを開きます。
  3. [構成プロパティ]-[リンカ]-[マニフェスト ファイル] を選択し、[UAC の実行レベル] で、「requireAdministrator」を選択します。

    図 4-15: マニフェスト ファイル パスの設定

    図 4-15: マニフェスト ファイル パスの設定

  4. アプリケーションをビルドします。

・マネージ コード (C#、Visual Basic) でマニフェストを埋め込むには

アプリケーション マニフェストを、マネージ コードに埋め込む方法です。Visual Studio 2008 でマニフェストを追加することができます。

  1. Visual Studio 2008 でプロジェクトを作成します。
  2. [プロジェクト]-[新しい項目の追加] で、「アプリケーション マニフェスト」を選択します。

    図 4-16: アプリケーション マニフェスト テンプレート

    図 4-16: アプリケーション マニフェスト テンプレート

  3. 追加された「app.manifest」ファイルで、「level="requireAdministrator"」を設定します。

    図 4-17: pp.manifest ファイル

    図 4-17: pp.manifest ファイル

  4. プロジェクトのプロパティを開きます。
  5. [プロジェクト] タブで、追加したマニフェスト ファイルが設定されていることを確認します。

    図 4-18: マニフェスト ファイルの設定

    図 4-18: マニフェスト ファイルの設定

  6. アプリケーションをビルドし、実行します。その結果、起動時に権限の昇格が求められます。

アプリケーションに署名を追加することで、権限の昇格ダイアログが表示されたときに、帯の色を黄色ではなく、青で表示させることができます。

署名については、「3.4 ファイルへの署名」を参照してください。

ページのトップへ


Windows 7 での既存アプリケーションへの対応

Windows Vista や Windows 7 では、既存のアプリケーションが標準ユーザーで動作できるように、いくつかの機能を提供しています。この機能により、多くの既存のアプリケーションは、コードを書き換えることなく Windows Vista や Windows 7 上で実行できるようになっています。

アプリケーションから、以下のような標準ユーザーに書き込み権限のない領域 (システム領域など) への書き込みを要求すると、ユーザーごとの領域へリダイレクトされます。

書き込み制限のあるマシンごとのストア リダイレクト先のユーザーごとのストア
%ProgramFiles% %LocalAppData%\VirtualStore\Program Files
%WinDir% %LocalAppData%\VirtualStore\Windows
HKLM\Software HKCU\Software\Classes\VirtualStore\Machine\Software

Windows Vista や Windows 7 では、アプリケーションをインストールするには管理者権限が必要です。そのため、インストール プログラムを実行するときには、昇格が必要となります。そこで Windows Vista や Windows 7 では、経験則に基づき特定のパターンに合致するプログラムを、インストーラーとして検出する機能が追加されています。インストーラーとして検出されると、自動的に権限昇格ダイアログが表示され、管理者権限で実行することができます。たとえば、ファイル名やバージョン情報に「setup」、「update」、「install」という文字列が含まれている場合、Windows Vista や Windows 7 はアプリケーションの実行時にインストラーとみなし、実行には昇格が必要であると認識します。そこで自動的に権限昇格用のダイアログ ボックスが表示されます。ここで昇格すれば、問題なくアプリケーションをインストールすることができます。ただし、自動検出するにはインストーラーが以下の要件を満たしている必要があります。

  • 32 ビット プログラムである
  • 対話型のプログラムである
  • マニフェストにより実行権限が指定されていないプログラムである

ユーザーごとの領域へのリダイレクト機能や、インストーラーの自動検出の機能は、既存のアプリケーション向けの一時的な互換性機能です。将来はサポートされなくなる可能性もあるため、新規に Windows 7 用のアプリケーションを作成する場合には、適切なストア パスを指定したり、Windows インストーラーを使用したりすべきです。

ページのトップへ


互換性を検証するには

昇格が必要かどうかを確認するため、標準ユーザーで実行しテストします。そして、すべての機能が昇格なしに実行できることを確認します。しかし、この方法ではアプリケーションの一部で問題が発生した場合、そのアプリケーションが終了することがあります。よって、バグを 1 つずつ見つけて修正していかなければならないため、時間がかかります。「Standard User Analyzer」ツールを使用することで、効率よく特権に関する問題を発見することができます。

以下のような現象が起こった場合、管理者権限がないために実行が失敗している可能性があります。

  • アクセス拒否のエラーが表示され、操作を続行できない
  • 「管理者権限が必要」というエラーが表示され、操作を続行できない
  • 何も起こらず、操作に失敗する
  • 権限昇格ダイアログが起動のたびに表示される

このような問題が発生する場合には、そのアプリケーションを管理者として実行するか、エラーが起こるコードの前で、UAC の権限昇格ダイアログを表示し、管理者で実行するなどの修正が必要です。

以下のユーザーを使用し、1 ~ 4 の順番で、アプリケーションの互換性をテストします。

  1. 標準ユーザー
  2. 管理者ユーザー (標準権限)
  3. アプリケーションのコンテキストメニューで、「管理者として実行」
  4. ビルトインの Administrator

テストの結果、1 や 2 で問題が起こり、3 や 4 では起こらないという場合は、UAC に起因している可能性が高いといえます。また、別のウィンドウとのやり取りにのみ問題があるという場合は、UIPI の問題である可能性があります。さらに、IE (Internet Explorer) がアプリケーションに関連している場合、保護モードの IE による問題の可能性もあります。UIPI については「4.4 ユーザーインターフェイス特権の分離 (UIPI)」、保護モードの IE については「4.5 IE のセキュリティ機能」を参照してください。

ページのトップへ


UAC 事例

ここでは、UAC を使用する上で発生する可能性の高い問題と対応策を 5 つ紹介します。

対象 ユーザーの権限をチェックしているアプリケーション
シナリオ アプリケーションの起動時 (多) やインストール時 (少)
現象 管理者グループのユーザーであるにもかかわらず、「管理者権限が必要です」というエラーが表示される
原因 UAC の「トークンフィルタ」機能により、プログラムが標準権限で動作している
解決方法 ユーザー・システム管理者向けの回避方法

権限を昇格して実行する
「ForceAdminAccess」や「ProtectedAdminCheck」互換フィックスを使用してアプリケーションを実行する

これらの互換フィックスを使用すると、権限は昇格しませんが、権限チェックに対して「管理者として実行している」と偽ることができます。このため、権限チェックを通過することができます。ただし、実際に管理者権限が必要な処理を呼び出すとエラーが発生します。
なお、「ForceAdminAccess」互換フィックスに関する詳細は、「Using the ForceAdminAccess Fix 」 を参考にしてください。

開発者向けの対応方法

以下の手順で既存のアプリケーションを変更します。

  1. 管理権限が必要な処理は別プログラムとして分離し、元のプログラムは標準ユーザーで動作させる
  2. 分離したプログラムの実行権限を、アプリケーション マニフェストで指定 (level = “requireAdministrator”) する
  3. 必要なときに ShellExecute() を使用して、分離したプログラムを呼び出す
対象 メインプログラム内に更新機能を持つアプリケーション
シナリオ アプリケーションの自動更新
現象 アプリケーションの自動更新が失敗する
原因 UAC の「トークンフィルタ」機能により、自動更新機能を含むプログラム全体が標準ユーザーで動作している
解決方法 ユーザー・システム管理者向けの回避方法 権限を昇格してメインアプリケーションを実行する
開発者向けの対応方法

以下のいずれかの対策をとります。

  • 管理権限が必要なアップデート機能は、別プログラムとして分離し、マニフェストにより実行権限を指定 (level = “requireAdministrator”) し、元のプログラムから ShellExecute() で呼び出す
  • MSI を使用する
対象 メインのプログラムとは別に、更新を行うプログラムを持つアプリケーション
シナリオ アプリケーションの自動更新
現象 アプリケーションの自動更新に失敗する
原因 CreateProcess() を使用してアップデータを呼び出している
解決方法 ユーザー・システム管理者向けの回避方法
  • メインのプログラムを管理者権限で実行する
  • 「ElevateCreateProcess」互換フィックスをメイン側に適用する

    「ElevateCreateProcess」互換フィックスを使用すると、メインから呼び出すアップデータのみが権限昇格します。詳細は「Using the ElevateCreateProcess Fix」(英語)を参考にしてください。

  • プログラム互換性アシスタントを利用し、自動的に「ElevateCreateProcess」を適用する
開発者向けの対応方法

以下のいずれかの対策をとります。

  • アップデーターの実行権限をマニフェストで指定 (level = “requireAdministrator”) し、メインのプログラムから ShellExecute() で呼び出す
  • MSI を使用する
対象 すべてのアプリケーション
シナリオ アプリケーションのインストール
現象 インストーラーが自動的に権限昇格されず、処理が失敗する
原因 インストーラーが UAC のインストーラー検出機能により検出されていない
解決方法 ユーザー・システム管理者向けの回避方法 インストーラーを権限昇格して実行する
開発者向けの対応方法

以下のいずれかの対策をとります。

  • インストーラーの実行権限をマニフェストで指定 (level = “requireAdministrator”) する
  • MSI を使用する
対象 すべてのアプリケーション
シナリオ アプリケーションの起動時
現象 アプリケーションの起動時に、意図せず自動的に権限昇格される
原因 プログラムが UAC のインストーラー検出機能により、インストーラーとして検出されている
解決方法 ユーザー・システム管理者向けの回避方法

「SpecificNonInstaller」互換フィックスを使用し、インストーラーとして検出されないようにする

「SpecificNonInstaller」互換フィックスに関する詳細は、「Using the ElevateCreateProcess Fix」(英語) を参考にしてください。

開発者向けの対応方法 マニフェストで実行権限を指定 (level = “asInvoker”) する

ページのトップへ