自作ソフトVMeter2のWindows Vista対応に大苦戦している。
主な問題点は以下。
1.CPU使用率が取得できない。
2.ネットワーク使用率が取得できない。
3.キーボード入力を拾えない(キーボードフック)
まず、「1.CPU使用率が取得できない」について。
今までのVMeter2をそのままVista上で実行すると、CPU使用率が取得できず
常に0%表示となる。
原因はCPU使用率などパフォーマンス取得するためには管理者権限が必要なため。
セキュリティー強化したVistaでは、そう簡単には実行させてもらえない。
いろいろ調べた結果、これらシステム情報なんかを取得するためには
実行時に管理者権限が必要らしい。
で、Vistaで管理者権限付きで実行するためには以下の方法がある。
方法1
exeファイルを右クリックし、ポップアップメニューから
「管理者として実行」を選択しアプリケーションを実行させる。
方法2
exeファイルを右クリックし、ポップアップメニューから
「プロパティ」を選択し、ダイアログ内の「互換性」タブ内にある
「管理者としてこのプログラムを実行する」を選択する。
方法3
ユーザアカウント制御(UAC)の設定を行う
方法4
アプリケーション作成時に、マニフェストとして追加する。
まず方法1については、毎回使用者に強要することはできないため論外。
方法2も1回設定すればいいとは言え、論外。
方法3は、このアプリのためにOSのセキュリティレベルを下げるようなもので、これも非現実的。
残ったのは方法4。これが一番、使用者にとっては自然で誤解も少ない。
ということで、マニフェストを使用することにより、管理者権限でexeやdllを実行するための方法を調べてみた。
現状のVMeter2のマニフェストは以下の通り。
<?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=”Microsoft.Windows.VMeter” type=”win32″ /> <description>VMeter2</description> <dependency> <dependentAssembly> <assemblyIdentity type=”win32″ name=”Microsoft.Windows.Common-Controls” version=”6.0.0.0″ processorArchitecture=”X86″ publicKeyToken=”6595b64144ccf1df” language=”*” /> </dependentAssembly> </dependency> </assembly>
で、Vistaで管理者権限でexeを実行するためには、以下のようなtrustInfo要素を追加しなければならないらしい。
<trustInfo xmlns=”urn:schemas-microsoft-com:asm.v3″> <security> <requestedPrivileges> <requestedExecutionLevel level=”requireAdministrator” uiAccess=”false” /> </requestedPrivileges> </security> </trustInfo>
これを組み合わせるとこんな感じのマニフェストになる。
# 22~28行目部分を追加。
<?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=”Microsoft.Windows.VMeter” type=”win32″ /> <description>VMeter2</description> <dependency> <dependentAssembly> <assemblyIdentity type=”win32″ name=”Microsoft.Windows.Common-Controls” version=”6.0.0.0″ processorArchitecture=”X86″ publicKeyToken=”6595b64144ccf1df” language=”*” /> </dependentAssembly> </dependency> <trustInfo xmlns=”urn:schemas-microsoft-com:asm.v3″> <security> <requestedPrivileges> <requestedExecutionLevel level=”requireAdministrator” uiAccess=”false” /> </requestedPrivileges> </security> </trustInfo> </assembly>
これでOK。
と言いたいが実はNG。理由は後記。
ビルドしたexeファイルをVista上に持っていく。
すると、管理者権限が必要なアプリケーションの場合、exeファイルのアイコン右下にシールドマークが表示される。
で、このVMeter2を実行すると、セキュリティ警告のダイアログが表示される。
これは、Windows XP SP2でも同じ挙動かな。
そのまま実行すると、Vista上では新たに「ユーザー アカウント制御」なんてダイアログが表示される。
これが、管理者権限で実行しますよー。という警告か。
「認識できないプログラムがこのコンピュータへのアクセスを要求しています」と表示されているが、自分自身が作成したexeなのでそのまま「許可」を選択し実行。
これでようやくVista上で管理者権限が必要な操作を実行することができる。
# しかし「不明な発行元」はどう対処したらよいのやら。
# 個人作成のアプリなんか皆「不明な発行元」となってしまうのか。
これでCPU使用率も取得でき問題解決。
と、思ったら甘かった。。。
同じexeファイルをWindows XP SP2上で実行すると、突然電源断!!
XPが落ちるなんて初めてだ。
まず最初にハードを疑ったが、exeを実行するタイミングでしか落ちない。
原因がさっぱり分からない。
原因を調べる際にも電源が何回も落ち、その都度、Windowsが起動するまで待たされる。
全然調査が進まない。
きっとハードがおかしくなってきたんだろうなと半ば諦めていた。
が、実はコレMicrosoftのバグということが判った。
http://support.microsoft.com/default.aspx/kb/921337/ja
ここの記事には、Vista用のタグを追加するとXP SP2で再起動と書いてある。
# 再起動というか、シャットダウン処理(保存処理)も無く突然電源断。
# 電源断といっても本当に電源OFFではなく、その後OSが起動される。
# ハードによってはWin9x系でよく出たブルー画面が出るようだ。
<2006.12.2追記>
ここに示した回避方法とかも試したけどイマイチ直らない。
このバグはVisual Studio 2005 Service Pack 1で修正される予定らしいので素直にこのSP1を待つことにした。
しかし、このVisual Studio 2005 Service Pack 1。ベータは提供されているが正式版はいつ提供されるのやら。
2007/1/31にはVistaが出るというのに。
困っている人は他にもいると思うけどなぁ。
記事が更新され、回避策が載っていました。
<trustInfo xmlns=”urn:schemas-microsoft-com:asm.v3″>
ってところを、
<ms_asmv3:trustInfo xmlns:ms_asmv3=”urn:schemas-microsoft-com:asm.v3″>
に修正すると回避できるとのこと。
ちゃんとした修正はVS2005のSP1で反映されるらしいけど。
<2006.12.22追記>
Visual Studio 2005 SP1が12/18に公開されていました。
# 詳細は2006/12/22の日記で。
</2006.12.22追記>
# ちなみに、この説明ページは日本語だと機械的に翻訳されてXML文が崩れている。
# 英語サイトに正確なXML文が載っているので、こちらを見て修正してください。
で、最終的にどう修正したかと言うとこんな感じになる。
<?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=”Microsoft.Windows.VMeter” type=”win32″ /> <description>VMeter2</description> <dependency> <dependentAssembly> <assemblyIdentity type=”win32″ name=”Microsoft.Windows.Common-Controls” version=”6.0.0.0″ processorArchitecture=”X86″ publicKeyToken=”6595b64144ccf1df” language=”*” /> </dependentAssembly> </dependency> <ms_asmv3:trustInfo xmlns:ms_asmv3=”urn:schemas-microsoft-com:asm.v3″> <security> <requestedPrivileges> <requestedExecutionLevel level=”requireAdministrator” uiAccess=”false” /> </requestedPrivileges> </security> </ms_asmv3:trustInfo> </assembly>
これでようやくXP SP2上でも落ちなくなり、Vista上でもCPU使用率が取得できるようになった。
# ちなみに、このマニフェストのお話はC/C++ネイティブで作っている場合の話です。
# .NET Framework上でのバグ有無などは不明ですが、マニフェスト自体はネイティブより簡単らしいです。
で、残り2つについては、実はまだ未解決です。
2.ネットワーク使用率が取得できない。
3.キーボード入力を拾えない(キーボードフック)
1.ができれば、2.も出来ると期待していたけど別物らしい。
1.を解決することにより、2.も解決できました。
やっぱり権限が必要らしい。
</2006.12.2追記>
3.は全く判らない。
全て解決するためには本物のVista環境でデバッグする必要がありそう。
ということで、VMeter2はしばらくWindows Vistaは制限となりそうです。
<2006.12.22追記>
3.についてもVS2K5SP1適用により無事解決しました。
</2006.12.22追記>