web-dev-qa-db-ja.com

シムを使用してWindowsのバージョン番号を変更できますか?

間違ったWindowsバージョン番号について文句を言うインストーラーがあり、Windows Server2012にインストールされるアプリケーションへのアップグレードを妨げています。

サポートされていないオペレーティングシステム、major = 6、version = 2.2、sp = 0.0、type = 3

shim を使用して、インストーラーのtype=3type=1に変更することはできますか?もしそうなら、重要なステップは何でしょうか?

.exeファイルのプロパティによると、インストーラーは dotNetInstaller で作成されました。 API関数を呼び出すことでバージョン番号を取得すると想像できます GetProductInfo(update:no、it's GetVersionEx )。インストーラーをさまざまな互換モードで実行してみました。残念ながら、それは報告されたバージョン番号には影響しません。スーパーユーザーの 私の質問 も参照してください。

6
feklee

私は最初の答えが間違っていました。あなたへの私の最初の提案は、あなたのアプリケーションのために「バージョン嘘」シムを作ることでした。しかし、マネージコードアプリケーションを使用しているため、できません。 .NETアプリケーション用のAPIフックを作成できないと言っているわけではありませんが、appcompat shimのサポートは、マネージドアプリの方がはるかに優れているようです。

アプリケーションシムはAPIリダイレクトを実装しているため、アプリケーションが特定のAPI呼び出しを行うと、アプリケーションはインターセプトまたは「ハイジャック」され、その他のデータがシムからアプリケーションに返されます。

http://technet.Microsoft.com/en-us/library/dd837644(v = WS.10).aspx

Shimインフラストラクチャは、アプリケーションプログラミングインターフェイス(API)フックの形式を実装します。具体的には、リンクの性質を利用して、API呼び出しをWindows自体から代替コード(シム自体)にリダイレクトします。

ほとんどの場合、アプリケーション互換性ツールキットを使用して独自のシムを作成できます。

http://blogs.technet.com/b/askperf/archive/2011/06/17/demystifying-shims-or-using-the-app-compat-toolkit-to-make-your-old- stuff-work-with-your-new-stuff.aspx

AppCompat Toolkit

そして、シムが実行されているバージョンについてアプリケーションに嘘をつく「バージョン嘘」を行うことは、appcompatシムの最も一般的なユースケースです。

開発者が主張コードでバージョンチェックを行うのは間違っているからです。マイクロソフトはそれが間違っているとあなたに言います。コードでバージョンチェックを行わないでください。 (代わりに、使用する予定の特定の機能の有無を確認してください。)

しかし、開発者は依然としてバージョンチェックを毎日行っています。さらに悪いことに、正確なバージョンのWindowsを実行していない限り、アプリが機能しない場所を「==」バージョンチェックします。これは恣意的で愚かです。

ため息...開発者。

MicrosoftのChrisJacksonは、アプリケーションの互換性に関する作業に長年取り組んできましたが、彼の態度は似ています。

人々が最も理解しやすいと思うシムのクラスの1つは、バージョン嘘シムです。本質的に、非常に多くの開発者のキーボードに欠陥のある>キーが付属しているという事実を補うことができるシムがあります(開発者のキーボードでのこのキーの失敗率は驚くべきものです)。これらは、選択したオペレーティングシステムに応じて、GetVersion(Ex)APIから異なる値を返すだけで機能します。

しかし残念ながら 同じ記事で 、彼は私がここで重要な情報であると私が信じているものを私たちに与えます:

これで、CompatAdminが起動したので、[システムデータベース]の下の[互換性の修正]リストを展開します。/xスイッチを使用すると、WinXPSP2VersionLieにプラス記号が付いていることがわかります。これを展開すると、横に赤いひし形が付いたモジュールのリストが表示されます。これらは、このシムが特に除外するモジュールです。これらの中で? .NETFrameworkモジュール。

ご覧のとおり、.NETFrameworkは嘘をつくのにそれほど親切ではありません。彼らは特定のものを実装する方法を決定するためにバージョンチェックを行います、そして彼らがダウンレベルで実行していると考えることはそれほど素晴らしいことではありません。したがって、これらのモジュールを意図的に除外し、その結果、これらのモジュールがJITを実行して実行しているコードを意図的に除外します。私たちがそうしたかったわけではありませんが、インフラストラクチャはこれらを分離するための優れた方法を提供しませんでした。私たちはすべてに嘘をついたか、何にも嘘をつきませんでした。すべてに嘘をつくのはもっと悪いので、私たちはしませんでした。

ふふ、それはちょっとおかしいです。私がちょうどそれがどれほど悪い考えであるかを言ったとき、.NETがバージョンチェックも行っているのです...

バージョン嘘を必要とする実際のアプリケーションの場合、アプリケーションが管理されている場合は、コードを変更する必要があります。これはあなたがシムアップすることはできませんし、すべきではありません。

したがって、バージョンの嘘が機能しておらず、アプリケーションが管理されていることに気付いた場合、私のスパイダーマンは、XPバージョンの嘘-で、それをシムしようとしていることを教えてくれます。動作しません。

から [〜#〜] msdn [〜#〜]

通常、アプリはオペレーティングシステムのバージョンチェックを実行しないでください。アプリに特定の機能が必要な場合は、その機能を見つけようとし、必要な機能がない場合にのみ失敗することをお勧めします。

5
Ryan Ries