Windows7とVB.NET 2008で質問です。

CPUのID番号を取得する方法を、System.Management.ManagementClass("Win32_Processor")を使わずに取得する方法を教えてください。

現在PCの個別識別で、OSのCPUのID番号・ProductActicationKey・Windowsインストール日時・MAC Address・CドライブのSerialNumberなどから、どれか一つを取得する仕組みを採用しています。
しかし、これらの取得に対して、全てSystem.Management.ManagementClass(~)を用いているため、テスト機の中には、まったく取得することが出来ないものがあり困っています。
一方テスト機を使用している者曰く「特殊なソフトや設定は入れていない」とのことなので、原因が分からず対処案が思いつかない状態です。

※「そんなものはありません」という答えはコメント欄に記載してください。回答に記載していただいた場合は、勝手ながら不適切な回答とさせていただきます。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/11/15 20:35:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答0件)

回答はまだありません

  • id:halohalolin
    なお、問題のPCでは、以下の方法によるPC情報を取得することもできません?でした。
     
    1.My.Computer.Info.OSFullNameで、PC名を取得する
    2.System.Environment.OSVersion.VersionStringで、OSのバージョンを取得する
    3.System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()などを利用してMacアドレスを取得する
    4.strGetRegistryAny("SOFTWARE\Microsoft\WINDOWS NT\CurrentVersion", "InstallDate")で、Windowsインストール時刻を取得する
     
    よろしくお願いいたします。
  • id:Silvanus
    その問題のあるPCも全てWindows7ですか?
    また、ManagementClass("Win32_Processor")で情報を取得できないPCにおいて
    コマンドラインからWMIC (CPUコマンド)を実行してもやはりProcessorIDを取得できませんか?
    http://support.microsoft.com/kb/290216/ja
  • id:taknt
    >OSのCPUのID番号

    そんなものありません。
  • id:halohalolin
    すみません、今の所、上記のコメントのうち3と4は取得出来ることがわかりました。
    個別認識で、いくつかの項目の中から一つ選ぶルーチンにも問題があるのかもしれません。
  • id:taknt
    http://ja.wikipedia.org/wiki/CPUID
  • id:halohalolin
    Silvanusさん・takntさん返答ありがとうございます

    Silvanus>その問題のあるPCも全てWindows7ですか?

    その通りです。

    Silvanus>WMIC (CPUコマンド)を実行してもやはりProcessorIDを取得できませんか?

    path win32_processor get ProcessorIDですね。調べてみます。

    takntさん>OSのCPUのID番号

    すみません。入力ミスです。
    正しくは、「CPUのID番号」で「OSの」は外してください。
  • id:halohalolin
    Silvanus>WMIC (CPUコマンド)を実行してもやはりProcessorIDを取得できませんか?
     
    取得出来ました。
    しかし、VBから以下のようにコードを書いた場合、問題のPCでは取得できないので困っています。
     
    Dim strResult As String = ""

    Try
    Dim objManagementClass As New System.Management.ManagementClass("Win32_Processor")
    Dim objManagementObjectCollection As System.Management.ManagementObjectCollection = objManagementClass.GetInstances()
    Dim objManagementObject As System.Management.ManagementObject

    For Each objManagementObject In objManagementObjectCollection
    strResult = objManagementObject("ProcessorId")
    objManagementObject.Dispose()
    Next

    objManagementObjectCollection.Dispose()
    objManagementClass.Dispose()
    Catch ex As Exception
    End Try

    Return strResult
  • id:taknt
    http://kandk.cafe.coocan.jp/jeans/index.php?itemid=137

    インラインアセンブルすればいいかも。
  • id:Silvanus
    WMICで取得できるのに、VBから取得できない…何ででしょう!?
    取得できないというのは具体的に言うと、strResultがnullのままということですか?
  • id:halohalolin
    的外れかもしれませんが、正常に動くWindowsはHome Premium
    問題のPCはProfessionalでした。

    Windowsセキュリティの差とかあるのかも・・・
  • id:halohalolin
    taknt さん> インラインアセンブルすればいいかも。

    taknt さんありがとうございます。
    しかしながら、アセンブラは組んだことが無いので、どうすればCPUの番号が取得できるのか基本すらわかりません。

    Silvanus さん> 取得できないというのは具体的に言うと、strResultがnullのままということですか?

    Silvanus さんありがとうございます。
    最後にstrResultをみると""っぽく感じていますが、調べてみます。
    ※自分のPCでなく、テスト先はVBも入っていない為、すぐに答えられなくてすみません。
  • id:Silvanus
    もしかして、DLLが入っていないとか!?
  • id:halohalolin
    Silvanusさんありがとうございます。
    今回の場合DLLは「System.Management.dll」だと考えていますが、どこにありますか?
  • id:halohalolin
    自分>的外れかもしれませんが、正常に動くWindowsはHome Premium
    自分>問題のPCはProfessionalでした。

    今、自分のWindows7Professional(WindowsXP上のVMWareに64bitWindows7を載せたもの、10月末以降、最近起動させていませんでした)では、問題の症状は発生しませんでした。
    やはり、ProとHome Premiumの差というのは、あまり関係ないのかも。
  • id:halohalolin
    自分> 今回の場合DLLは「System.Management.dll」だと考えていますが、どこにありますか?

    PC内検索で見つけられました。

    C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management\v4.0_4.0.0.0__b03f5f7f11d50a3a
    C:\Windows\Microsoft.NET\Framework\v4.0.30319

    ちなみに、問題のPCでもSystem.Management.dllは見つけられました。
  • id:Silvanus
    そらそうですよね…。Cimwin32.dllもありますよね?
    いよいよ判らなくなってきました…。
    問題のマシンでは、ProcessorIDだけでなくて、
    他のアトリビュート(例えばSystemName等)も返さないんですよね?
    過去に、Cimwin32.dllが、AMDのCPUの情報を正しく返さなかったりとか、
    この辺りにはいろいろ問題がありましたからね…。
  • id:halohalolin
    異常が起こるPCでは、先のサンプルの場合、strResult=""でした。
    なぜなら例外「指定されたキャストは有効ではありません」が発生するからです。
  • id:Silvanus
    念の為、上手く行くPCと、ダメなPCで
    Cimwin32.dllのバージョン(ファイルのタイムスタンプ)が
    同じか、違うかを調べてみていただけますか?
    もし、上手く行くPCでバージョンが同一で、
    ダメなPC全てにおいてそれと異なるんだったなら
    Cimwin32のせいかも…違うかなぁ(苦笑)。
  • id:halohalolin
    Silvanusさんありがとうございます。

    ダメなPCのcimwin32.dllについてですが、2か所見つかりました。

    C:\Windows\System32\wbem 更新日付 2009/07/14 10:40 サイズ:1.95MB
    C:\Windows\winsxs\amd64_microsoft-windows-w..ovider-cimwin32-dll_31bf3856ad364e35_6.1.7600.16385_none_2b9fe2d81fc0d22c 更新日付 2009/07/14 10:40 サイズ:1.95MB
  • id:halohalolin
    一方、正常なPCのcimwin32.dllについてですが、こちらも2か所見つかりました。
    場所と更新日時はだめなPCと同じです。
    ただ、サイズは1.27MBでした。
    …もしかしてここでしょうか???
  • id:Silvanus
    成功するもの、失敗するもの、いずれも複数台調査しないと何とも言えませんが…。
    いかがですか?
  • id:halohalolin
    Silvanusさん何度も返答してくださり、本当にありがとうございます。
    今日は残念ながら時間切れになってしまったので、明日までお待ち下さい。
  • id:Silvanus
    DLLのバージョンによって、この辺り↓の問題に引っかかって来てるんでしょうか…。
    http://support.microsoft.com/kb/323737/ja
  • id:halohalolin
    Silvanusさんありがとうございます。
    問題PCの台数は1台だけなのですが、本日何もしていないのに、問題動作(値が取得できない問題)が解決しました。
    つまり、問題PCが、PCに何かのインストール指示をしたり、検証プログラムに変更を加えたわけでないのに
    今の所、他の正常PCと同じように動作しています。
     
    これが噂の「夜、小人さんが何とかしてくれた」というやつなのでしょうか・・・?
    問題が検証できるPCが手元になくなった以上、これで問題解決とすべきなのか、さらに手さぐりで原因究明すべきなのか迷ってますorz。
  • id:Silvanus
    良かったではないですか! 小人さんはきっと
    halohalolinさんが悪戦苦闘されているのを見かねて直してくれたんですよw
    小人さんが直せたということは、少なくともDLLのバージョンとか
    そういう問題では無さそうですね。
    また同様の問題が起こった時に原因究明すれば良いのでは?
  • id:halohalolin
    Silvanusさん、何度もお付き合い頂きありがとうございました。

    小人さんも、SubversionかWikiに修正箇所を記載してくれると安心出来るのですがw
    とりあえず、様子見させていただきます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません