2017-03-22 8 views
0
Public Class Form1 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     lblSystemSerialNumbers.Text = SystemSerialNumber() 
     lblCpuIds.Text = CpuId() 
    End Sub 

    Private Function SystemSerialNumber() As String 
     ' Get the Windows Management Instrumentation object. 
     Dim wmi As Object = GetObject("WinMgmts:") 

     ' Get the "base boards" (mother boards). 
     Dim serial_numbers As String = "" 
     Dim mother_boards As Object = wmi.InstancesOf("Win32_BaseBoard") 
     For Each board As Object In mother_boards 
      serial_numbers &= ", " & board.SerialNumber 
     Next board 
     If serial_numbers.Length > 0 Then serial_numbers = serial_numbers.Substring(2) 

     Return serial_numbers 
    End Function 

    Private Function CpuId() As String 
     Dim computer As String = "." 
     Dim wmi As Object = GetObject("winmgmts:" & _ 
      "{impersonationLevel=impersonate}!\\" & _ 
      computer & "\root\cimv2") 
     Dim processors As Object = wmi.ExecQuery("Select * from Win32_Processor") 

     Dim cpu_ids As String = "" 
     For Each cpu As Object In processors 
      cpu_ids = cpu_ids & ", " & cpu.ProcessorId 
     Next cpu 
     If cpu_ids.Length > 0 Then cpu_ids = cpu_ids.Substring(2) 

     Return cpu_ids 
    End Function 
End Class 

このコードは、CPU IDとマザーボードIDを取得します。オプションstrictがオンの場合でも、これが確実に機能するようにするにはどうすればよいですか。このコードをオプションstrictでオンにするにはどうすればよいですか?

なぜこれが問題になりますか?

さて、見てみましょう。 wmiのタイプはObjectです。 wmiはInstancesOf、SerialNumberなどのメソッドを必ずしもサポートしていません

これをどうやって引き出すことができますか?

私がGetObjectから得たオブジェクトは純粋なオブジェクトではないと思います。私はそれをより適切なタイプにキャストまたは直接キャストすべきだと思います。より適切な型は、InstancesOf、SerialNumberなどのメソッドをサポートします。

しかし、適切な型は何ですか?

+2

GetObjectを変更して、ManagementObjectSearcherとそのクラスを使用しようとしましたか? – Steve

+0

私はそれが意味することを理解していません –

+0

wmiのタイプはcomオブジェクトです。 ctypeを実行できるラッパークラスはありますか?それはあなたが意味することですか? –

答えて

2

System.Management.dllアセンブリ内でホストされているWMIクラスのManagementObjectSearcherを使用できます。
(適切な参照を追加する必要があります)。あなたが偽装フラグを設定するためのCPUID機能が少し複雑ですが、NETラッパークラスを中心にメソッドを記述することが可能です

Private Function SystemSerialNumber(computer As String) As String 

    Dim wmi = New ManagementObjectSearcher(computer & "\root\cimv2", "select * from Win32_BaseBoard") 

    Dim boards = New List(Of String)() 
    For Each board In wmi.Get() 
     Dim temp = board.Properties("SerialNumber").Value?.ToString() 
     If Not String.IsNullOrEmpty(temp) Then 
      boards.Add(temp) 
     End If 
    Next board 
    Return String.Join(", ", boards) 
End Function 

としてSystemSerialNumberを書くことができ、このようにして

WMIインターフェイスの場合

Private Function CpuId(computer As String) As String 
    Dim cpu = New List(Of String)() 

    Dim options = New ConnectionOptions() 
    options.Impersonation = System.Management.ImpersonationLevel.Impersonate 

    Dim scope = New ManagementScope(computer & "\root\cimv2", options) 
    scope.Connect() 

    Dim query = New ObjectQuery("Select * from Win32_Processor") 
    Dim wmi = New ManagementObjectSearcher(scope, query) 
    For Each m As ManagementObject In wmi.Get() 
     Dim temp = m.Properties("ProcessorId").Value?.ToString() 
     If Not String.IsNullOrEmpty(temp) Then 
      cpu.Add(temp) 
     End If 
    Next 
    Return String.Join(", ", cpu) 
End Function 
関連する問題