1

WMI を使用して実行できます。

しかし、簡単な方法はありますか(に似ていEnvironment.Is64BitOperatingSystemます)?

編集: WMI にはアクセス許可の制限があります。私が知る限りIs64BitOperatingSystem、この点ではるかに「優れている」と思われます。(間違っていたら訂正してください。)

例外をスローすることなく、コードが常に実行されるようにしています。

4

1 に答える 1

4

まず、Environment.Is64BitOperatingSystemは特別な権限を必要とせずにジョブを実行できます。これは、実際にはまったくチェックを行わないためです。.NET Framework の 64 ビット バージョンは true を返すように、32 ビット バージョンは false を返すようにハードコーディングされています。そのような単純な。

残念ながら、取得したい情報については少し複雑になります。

WMI を介してこの情報を取得する方法はわかりませんがSerialNumber、クラスのプロパティを照会しWin32_OperatingSystem、Windows 製品 ID の形式について既に知っている情報を取得して、OS がインストールされているかどうかを判断していると思います。 OEM キーを使用します。そのキーの 2 番目の部分に がある場合OEMは true を返し、そうでない場合は false を返します。

もちろん、キーのそのセクションは、OEM キーを示す特定の数値を使用して数値にすることもできます。たとえば、600 年代の特定の値は OEM キーを示していることを覚えていますが、正確にどのキーかはわかりませんでした。願わくば、これらすべてのマスター リスト (どこから来たのだろうか?) を持っていて、それらと照合していることを願っています。そうしないと、多くの偽陰性が発生します。

とにかく、それがあなたのアプローチであると仮定すると (そして、私が考えることができる唯一のものです)、質問は「WMI を使用せずに Windows の製品 ID を取得するにはどうすればよいですか?」ということになります。

レジストリにクエリを実行することもできますが、これは脆弱なアプローチです。レジストリの特定の場所にあるとは文書化されていないため、これは Windows のバージョン間で変更される可能性があります。現在のバージョンでは、

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId

これを機能させるには、32 ビットと 64 ビットを適切に処理する必要があり、アプリケーションには昇格が必要になりますHKEY_LOCAL_MACHINE

私の知る限り、この情報は Win32 API によって公開されることはありません。確かにIsOEMVersion関数はなく、構造体のメンバーのOSVERSIONINFOEX1 つでも、関数によって使用されるフラグの 1 つでもありませんIsOS

明らかに、WMI が存在する理由があります。それがあなたが望むものをするなら、あなたはそれを使うべきです。それについて本質的に「安全でない」ものは何もありません。クエリしたい情報にアクセスするために特定の特権が必要な場合、それには理由があり、それらのセキュリティ制限を回避する別のアクセス ルートを見つけることに成功することはあまりありません。

部分的に信頼されたコードで WMI の強力な機能を利用することが絶対に必要な場合は、必要な機能を公開する完全に信頼された中間アセンブリを作成し、それを部分的に信頼されたアセンブリから呼び出すことができます。

ただし、この特定のケースでは、なぜこの情報が必要なのか、または必要なのかを真剣に検討する必要があります。オペレーティング システムの OEM バージョンである場合、どのような違いがありますか? あなたの観点からは同じように動作します (ユーザーとしても開発者としても)。この情報を使用して何を達成しようとしているのかについて、より多くの情報を提供していただければ、より良い提案ができる可能性があります。

于 2013-05-10T12:13:25.050 に答える