WmiMonitorID-将结果转换为ASCII

时间:2018-08-03 06:43:19

标签: vb.net wmi-query

Am正在尝试查询显示器的序列号和型号。设法使用WMI代码创建器来生成以下代码:

Try
        Dim MInfo As New ManagementObjectSearcher("root\WMI", "SELECT * FROM WmiMonitorID")

        For Each Monitor In MInfo.Get()

            If Monitor("SerialNumberID") Is Nothing Then
                MsgBox("NA")
            Else
                Dim arrSerialNumberID As UInt16()
                arrSerialNumberID = Monitor("SerialNumberID")
                For Each arrValue As UInt16 In arrSerialNumberID
                    Console.WriteLine("Serial: " & arrValue)
                Next

            End If
            If Monitor("UserFriendlyName") Is Nothing Then
                MsgBox("NA")
            Else
                Dim arrSerialNumberID As UInt16()
                arrSerialNumberID = Monitor("UserFriendlyName")
                For Each arrValue As UInt16 In arrSerialNumberID
                    Console.WriteLine("Model: " & arrValue)
                Next

            End If

        Next
    Catch err As ManagementException
        MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
 End Try

输出如下:

SerialNumberID:67,78,75,52,49,49,49,49,55,57,0,0,0,0,0,0
UserFriendlyName:104,112,32,76,49,53,51,48,0,0,0,0,0

Am尝试将输出转换为ASCII。

1 个答案:

答案 0 :(得分:1)

返回的数组需要转换为字符串,以变得人眼友好。
UInt16字节数组可以用Convert.ToByte(UInt16)转换,然后用Encoding.GetString()转换为字符串。

在这里,转换方法包含在专门的类(MonitorID)中,该类用于查询系统\WMI\WmiMonitorID来返回系统中所有Monitor的某些信息。
可以使用\CIMV2\Win32_DesktopMonitor

进行扩展

您可以通过以下方式使用它:

Dim MonitorIds As List(Of MonitorID) = GetDesktopMonitorsID()

会返回(以及其他详细信息):
MonitorIds(0).SerialNumberID = CNK4111179
MonitorIds(0).UserFriendlyName = HP L1530

类和WMI查询方法:

Imports System.Management

Public Class MonitorID
    Public Property Active As Boolean?
    Public Property InstanceName As String
    Public Property ManufacturerName As String
    Public Property ProductCodeID As String
    Public Property SerialNumberID As String
    Public Property UserFriendlyName As String
    Public Property WeekOfManufacture As String
    Public Property YearOfManufacture As String

    Public Shared Function ConvertToString(mObject As Object) As String
        If mObject Is Nothing Then Return String.Empty
        Return Encoding.UTF8.GetString(CType(mObject, UInt16()).
                TakeWhile(Function(ui) ui <> 0).Select(Function(ui) Convert.ToByte(ui)).ToArray())
    End Function
End Class


Public Shared Function GetDesktopMonitorsID() As List(Of MonitorID)
    Dim MonitorsIds As New List(Of MonitorID)()

    Dim ConnOptions As New ConnectionOptions() With {
        .EnablePrivileges = True,
        .Timeout = EnumerationOptions.InfiniteTimeout
    }

    Dim mOptions As New EnumerationOptions() With {
        .Rewindable = False,
        .ReturnImmediately = True,
        .DirectRead = True,
        .EnumerateDeep = False
    }

    Dim mQuery As New SelectQuery("SELECT * FROM WmiMonitorID")
    Dim mScope As New ManagementScope("\\" + Environment.MachineName + "\root\WMI", ConnOptions)
    mScope.Connect()

    Using moSearcher As New ManagementObjectSearcher(mScope, mQuery, mOptions)
        For Each moMonitor As ManagementObject In moSearcher.[Get]()

        MonitorsIds.Add(New MonitorID() With {
            .Active = CType(moMonitor("Active"), Boolean?),
            .InstanceName = moMonitor("InstanceName")?.ToString(),
            .ManufacturerName = MonitorID.ConvertToString(moMonitor("ManufacturerName")),
            .ProductCodeID = MonitorID.ConvertToString(moMonitor("ProductCodeID")),
            .SerialNumberID = MonitorID.ConvertToString(moMonitor("SerialNumberID")),
            .UserFriendlyName = MonitorID.ConvertToString(moMonitor("UserFriendlyName")),
            .WeekOfManufacture = moMonitor("WeekOfManufacture")?.ToString(),
            .YearOfManufacture = moMonitor("YearOfManufacture")?.ToString()
        })
        Next
    End Using
    Return MonitorsIds
End Function