Windows Vista の新しい UAC の機能 (セキュリティ) でコードが例外を出す場合の対処について


環境: Windows Vista RC1 

こんにちは。

Microsoft On で出ずっぱりで、ブログが停滞しすみません。
今日は、そんな Microsoft On で非常にご質問の多い、上記について方法概要しかご回答できていませんので、手順の詳細を記載します。(昨日のセミナーでもご質問を受けました。)

この方法は、下記のサイトで既に掲載済みの内容です。(が、日本の開発者の方のために、日本語で)

http://blogs.msdn.com/uac/

https://channel9.msdn.com/Showpost.aspx?postid=209647

https://channel9.msdn.com/Showpost.aspx?postid=211271

http://community.bartdesmet.net/blogs/bart/archive/2006/10/28/Windows-Vista-_2D00_-Demand-UAC-elevation-for-an-application-by-adding-a-manifest-using-mt.exe.aspx

【UAC について】 

まず、UAC の機能と、アプリケーションへの影響についてご説明します。(ご存知の方はここは読み飛ばしてください。)
新しい Windows Vista では、セキュリティの強化が1つの目玉機能として存在しています。その中で、開発したアプリケーションがもっとも影響が受けやすいのがこの仕組みです (次がセッション0でのサービス実行の件でしょうか、、、)。Vista では、管理者権限のユーザでログインをしていても、普段は管理者でない権限で動作をし、管理者権限が必要なオペレーションを発行した際に、管理者権限に昇格させるためのダイアログが表示され、これに同意してはじめてオペレーションを実行することができます。例えば、(私のMicrosoft On でよくやるデモですが)管理者のユーザでログインし、regedit などのコマンドを打ってみると確認できます。この仕組み、日本ではうっとうしがられていますが、いつもセミナーでご説明する通り、これは不用意に管理者特権で事故をおこさないための措置です。例えば、XP などで、「システムファイルを表示しない」という設定をされている方も居られると思いますが、これも同様、マウスなどに指をひっかけて間違えてシステムファイルを移動してしまう、なんて事故をおこさないための措置で、「ドラッグ アンド ドロップ」という便利さの代償を避けるためのものです。

追記 : UAC (メカニズムなど) については、「Windows 7 互換性 (全般)」に掲載しました。(背景などをちゃんと学習したい方は、そっちを参照してください。)

さてこの仕組み、Windows の機能を使っているうちは大きな問題はありませんが、開発したアプリケーションを実行する場合には大変邪魔になることがあります。ダイアログが出てくれればまだましなのですが、実際にはダイアログが出ずに、純粋にエラーになります。例えば、分散トランザクションを実行しようとする場合など、COM+ への登録でエラーになるのです。

簡易な回避方法の1つとして、利用者が、このUAC の機能をオフ(OFF)にすることができるため、「使用時はオフにしてください」という運用もあります。が、広範囲なアプリケーションなどで、利用者全員にそうして使ってもらうというのも日本のユーザには受け入れ難いでしょう。

【ではどう対処するか】

そこで、自前のアプリケーションの起動時に例の Windows の権限昇格のプロンプトを出させて、以降は管理者権限ですいすいと実行させる方法を以下に記載します。

まず、以下の内容のマニフェストファイル (ファイル名は [実行ファイル名].manifest  例えばここでは、WindowsApplication1.exe.manifest) をプロジェクトのフォルダに作成してください。
内容で、アプリケーション名 (WindowsApplication1.exe) の入っている箇所は、各自のアプリケーション名で変更してください。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="WindowsApplication1" type="win32"/>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator"/>
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly>

つぎに、プロジェクトのプロパティを表示し、[コンパイル] タブにある [ビルドイベント] ボタンを押して、ビルド後の処理をカスタマイズします。[ビルド後] の入力欄に、以下のコマンドをそのまま入力してください。

"$(DevEnvDir)....SDKv2.0binmt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest"  -outputresource:"$(TargetDir)$(TargetFileName)";#1

(コピー/ペーストで、たまに、ハイフンがクエスチョンマークに化けることがあるので、入力後の内容も要チェックです!)

リビルドを実行して、作成されたアプリケーションを実行してみてください。 
権限昇格のプロンプトが表示され、以降は管理者権限で動作します (管理者としての操作を実行可能です)。

尚、必要ないかとは思いますが、ClickOnce で同じことができないかと思い試してみました。
マニフェストを手動で作成し、Sign せずに保存し(マニフェストの手動作成の方法については以前このブログでも取り上げました)、作成したマニフェストに上記の編集(追記)をおこなって mage コマンドで署名(-Sign オプション)をおこなって保存し、デプロイマニフェストも署名して作成してみましたが、残念ながら Execution level requested by the application is not supported というエラーが出て実行できません。

(本ブログの継続トピックは こちら)


 


Comments (0)

Skip to main content