関東地区ではまだまだゲリラ雨が続いておりますが、いかがお過ごしでしょうか?
「CHIZTEK(チズテク) 手描き地図検索」の開発チームです。
さて、弊社はWeb開発が業務の中心となっていますが、たまに「Win32アプリケーション」といった非WebのWindows アプリケーションの開発案件が舞い込んできます。
今回はそんな中で学んだ「Visual Studio 2008とUAC(ユーザーアカウント制御)」についての情報です。
通常はあまり意識しませんが、ごくまれに「管理者(Administrator)権限が無いと出来ないような操作」をしなければならない場合があります。
(HKEY_LOCAL_MACHINEのレジストリエントリを操作したり、インストール操作をしたり…)
XP以前のアプリケーションであれば「IsAnUserAdmin()」というような関数を使って現在のユーザ権限判断をして、持っていないなら適宜エラー処理、となるのですが、Vistaになって「UAC(ユーザーアカウント制御)」という仕組みが導入されました。
正直言ってしまえばこれは大変やっかいな仕組みで(苦笑)、UACが有効になっている環境では、仮に管理者権限でログインしていても、右クリックで「管理者として実行」を選ばなければフルコントロールで実行することが出来ません。

当然UACなどの仕組みやこの方法を知らないユーザからすれば、「どうやっても実行できないアプリケーション」になってしまいます。
(それがUACの狙いなのかもしれませんが…)
ということで、これを何とか避けるためには「明示的に管理者権限を要求する」ようにしたいわけですが、Webを調べたところ「Manifestに細工して要求する権限を書く」ということが分かりました。
参考リンク:
http://www.geocities.jp/i_love_balard/myhome/dnet/manifest.html
http://blogs.msdn.com/tsmatsuz/archive/2006/11/01/windows-vista-uac.aspx
ところが、自分でManifest.xmlを追加してみても、Visual Studio 2008環境ではなんだか上手く行かないのです。
コンパイル時に「manifest authoring error c1010001: Values of attribute “level” not equal in different manifest snippets.」というエラーを吐いてしまいます。
どうやら、VS2008が勝手に作ってくれる「アプリケーション名.exe.intermediate.manifest」の設定と違うことが理由のようです。
ということで、色々と調べてみた結果、ついに「プロジェクト」の「プロパティ」に設定を発見しました!

ここで設定してやれば、別に自前でManifestを追加することなく、「管理者権限を明示的に要求するアプリケーション」を作ることが出来ます。
ということで、無事コンパイルされた結果がこちらです。

無事アイコンに「盾マーク」がつきました!
もちろんダブルクリックで起動すれば、管理者権限を要求するダイアログが出てきます。
分かってしまえば沢山情報はあるのですが(苦笑)、見つからなければなかなか見つからないのがこのテの情報の特徴です。
Visual Studio2008でハマってしまっている方のお役に立てれば幸いです。
それでは失礼致します。