0

PCにインストールされているWindowsのバージョンを識別する必要がある独立したC++コード(つまり、Windowsプログラムではない)があります。

カーネルバージョン(ntoskrnl.exeなど)によって異なるWindowsクライアントリリースを簡単GetFileVersionInfoに区別できますが、クライアントとサーバーのインストールを区別する信頼できる方法があるかどうか疑問に思っています。

この方法を使用してWindowsVistaSP2とWindowsServer2008 SP2(両方とも6.0ビルド6002)とWindows7とWindowsServer 2008 R2(RTM用の6.1ビルド7600とSP2用の6.1ビルド7601の両方)を区別すると、問題が発生します。 。環境外で実行されているコードに対してクライアントとサーバーのOSを正しく識別するための信頼できる(そしてできればできるだけ簡単に、レジストリを回避することはWin32 APIへのアクセスが利用できないので素晴らしい)方法は何ですか?

サーバーエディションにのみ存在するファイルをチェックできると思います(構成に関係なく、サーバーエディションのインストールで保証される適切なファイルは何ですか?)、Pantherフォルダーをチェックします(削除しても安全なので、保証はありません)、などですが、これは人々が以前に遭遇し、(うまくいけば)よりエレガントに解決した問題だと確信していますか?

(補足:この質問は以前にSOで質問されましたが、ソリューション(WMI)は帯域外チェックには適用できません)

4

3 に答える 3

0

私は結局、WindowsのServerEditionに一般的に関連付けられているsystem32ディレクトリ内のいくつかのバイナリを検索しました。あまりきれいではありませんが、実際には非常にうまく機能します。

于 2012-12-14T19:13:01.730 に答える
0

帯域外チェックの意味がよくわからないので、とりあえず無視します。

通常の方法は、を呼び出しGetVersionExて、のwProductTypeメンバーを確認することOSVERSIONINFOEXです。

于 2012-05-11T03:30:00.160 に答える
0

PEイメージは、イメージがクライアントとサーバーのどちらで機能するかを指定しません。サブシステム、依存関係、メモリ、アフィニティなどに関する実行時の要件のみを指定します。

于 2012-05-11T07:22:03.740 に答える