Vista対応

自作ソフト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追記>


Leave a comment

メールアドレスが公開されることはありません。

CAPTCHA


*