CPUのID番号を取得する方法を、System.Management.ManagementClass("Win32_Processor")を使わずに取得する方法を教えてください。
現在PCの個別識別で、OSのCPUのID番号・ProductActicationKey・Windowsインストール日時・MAC Address・CドライブのSerialNumberなどから、どれか一つを取得する仕組みを採用しています。
しかし、これらの取得に対して、全てSystem.Management.ManagementClass(~)を用いているため、テスト機の中には、まったく取得することが出来ないものがあり困っています。
一方テスト機を使用している者曰く「特殊なソフトや設定は入れていない」とのことなので、原因が分からず対処案が思いつかない状態です。
※「そんなものはありません」という答えはコメント欄に記載してください。回答に記載していただいた場合は、勝手ながら不適切な回答とさせていただきます。
よろしくお願いします。
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インストール時刻を取得する
よろしくお願いいたします。
また、ManagementClass("Win32_Processor")で情報を取得できないPCにおいて
コマンドラインからWMIC (CPUコマンド)を実行してもやはりProcessorIDを取得できませんか?
http://support.microsoft.com/kb/290216/ja
そんなものありません。
個別認識で、いくつかの項目の中から一つ選ぶルーチンにも問題があるのかもしれません。
Silvanus>その問題のあるPCも全てWindows7ですか?
その通りです。
Silvanus>WMIC (CPUコマンド)を実行してもやはりProcessorIDを取得できませんか?
path win32_processor get ProcessorIDですね。調べてみます。
takntさん>OSのCPUのID番号
すみません。入力ミスです。
正しくは、「CPUのID番号」で「OSの」は外してください。
取得出来ました。
しかし、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
インラインアセンブルすればいいかも。
取得できないというのは具体的に言うと、strResultがnullのままということですか?
問題のPCはProfessionalでした。
Windowsセキュリティの差とかあるのかも・・・
taknt さんありがとうございます。
しかしながら、アセンブラは組んだことが無いので、どうすればCPUの番号が取得できるのか基本すらわかりません。
Silvanus さん> 取得できないというのは具体的に言うと、strResultがnullのままということですか?
Silvanus さんありがとうございます。
最後にstrResultをみると""っぽく感じていますが、調べてみます。
※自分のPCでなく、テスト先はVBも入っていない為、すぐに答えられなくてすみません。
今回の場合DLLは「System.Management.dll」だと考えていますが、どこにありますか?
自分>問題のPCはProfessionalでした。
今、自分のWindows7Professional(WindowsXP上のVMWareに64bitWindows7を載せたもの、10月末以降、最近起動させていませんでした)では、問題の症状は発生しませんでした。
やはり、ProとHome Premiumの差というのは、あまり関係ないのかも。
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は見つけられました。
いよいよ判らなくなってきました…。
問題のマシンでは、ProcessorIDだけでなくて、
他のアトリビュート(例えばSystemName等)も返さないんですよね?
過去に、Cimwin32.dllが、AMDのCPUの情報を正しく返さなかったりとか、
この辺りにはいろいろ問題がありましたからね…。
なぜなら例外「指定されたキャストは有効ではありません」が発生するからです。
Cimwin32.dllのバージョン(ファイルのタイムスタンプ)が
同じか、違うかを調べてみていただけますか?
もし、上手く行くPCでバージョンが同一で、
ダメなPC全てにおいてそれと異なるんだったなら
Cimwin32のせいかも…違うかなぁ(苦笑)。
ダメな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
場所と更新日時はだめなPCと同じです。
ただ、サイズは1.27MBでした。
…もしかしてここでしょうか???
いかがですか?
今日は残念ながら時間切れになってしまったので、明日までお待ち下さい。
http://support.microsoft.com/kb/323737/ja
問題PCの台数は1台だけなのですが、本日何もしていないのに、問題動作(値が取得できない問題)が解決しました。
つまり、問題PCが、PCに何かのインストール指示をしたり、検証プログラムに変更を加えたわけでないのに
今の所、他の正常PCと同じように動作しています。
これが噂の「夜、小人さんが何とかしてくれた」というやつなのでしょうか・・・?
問題が検証できるPCが手元になくなった以上、これで問題解決とすべきなのか、さらに手さぐりで原因究明すべきなのか迷ってますorz。
halohalolinさんが悪戦苦闘されているのを見かねて直してくれたんですよw
小人さんが直せたということは、少なくともDLLのバージョンとか
そういう問題では無さそうですね。
また同様の問題が起こった時に原因究明すれば良いのでは?
小人さんも、SubversionかWikiに修正箇所を記載してくれると安心出来るのですがw
とりあえず、様子見させていただきます。