Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WmiMonitorID-将结果转换为ASCII_.net_Vb.net_Wmi_Wmi Query - Fatal编程技术网

.net WmiMonitorID-将结果转换为ASCII

.net WmiMonitorID-将结果转换为ASCII,.net,vb.net,wmi,wmi-query,.net,Vb.net,Wmi,Wmi Query,我正在尝试查询监视器的序列号和型号。 我设法使用WMI代码创建者生成以下代码: Try Dim MInfo As New ManagementObjectSearcher("root\WMI", "SELECT * FROM WmiMonitorID") For Each Monitor In MInfo.Get() If Monitor("SerialNumberID") Is Nothing The

我正在尝试查询监视器的序列号和型号。
我设法使用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

我正在尝试将输出转换为ASCII。

返回的数组需要转换为字符串,以便人眼友好。
可以使用转换
UInt16
字节数组,然后使用转换为字符串

这里,一个转换方法包含在一个专门的类(
MonitorID
)中,该类用于返回系统中所有监视器的一些信息,查询。
它可以通过

您可以这样使用它:

Dim MonitorIds As List(Of MonitorID) = GetDesktopMonitorsID()
将返回(以及其他详细信息):

类和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
导入系统管理
公共类监视器
公共属性是否作为布尔值活动?
公共属性InstanceName作为字符串
公共属性ManufacturerName作为字符串
公共属性ProductCodeID为字符串
公共属性SerialNumberID为字符串
公共属性UserFriendlyName作为字符串
作为字符串的公共属性
作为字符串的公共财产制造年份
公共共享函数ConvertToString(mObject作为对象)作为字符串
如果mObject为Nothing,则返回String.Empty
返回Encoding.UTF8.GetString(CType(mObject,UInt16())。
TakeWhile(函数(ui)UI0)。选择(函数(ui)Convert.ToByte(ui)).ToArray()
端函数
末级
公共共享函数GetDesktopMonitorsID()作为(MonitorID的)列表
Dim MONITORSID作为新列表(监视器ID)()
将选项设置为新连接选项(),带有{
.EnablePrivileges=True,
.Timeout=枚举选项.InfinitieTimeout
}
将选项设置为新的枚举选项(),带有{
.Rewindable=False,
.return立即=真,
.DirectRead=True,
.deep=False
}
将mQuery设置为新的SelectQuery(“从WmiMonitorID中选择*)
将mScope设置为新的管理作用域($“\\{Environment.MachineName}\root\WMI”,选项)
mScope.Connect()
使用moSearcher作为新的ManagementObjectSearcher(mScope、mQuery、mOptions)
对于moSearcher中作为管理对象的每个moMonitor。[Get]()
添加(新的MonitorID()和{
.Active=CType(moMonitor(“Active”),布尔值,
.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(“制造年份”)?.ToString()
})
下一个
终端使用
返回监视器
端函数

“我正在尝试将输出转换为ASCII。”好的-那么你在尝试什么,什么不起作用?你查过“在vb.net中将数字转换为ASCII字符”吗?我相信你最喜欢的搜索引擎中的那个问题会很快给你答案。是的,我试过了。问题是我找不到解决方法。您的序列号被放入一个数组中,所以只需循环数组并将每个元素转换为一个字符?否则,将分隔符上的返回字符串拆分为一个数组,然后循环该数组。嗨,Jimi,感谢您的帮助回答。我试过你的功能,但似乎不起作用。在WMI查询中添加了一个try-catch异常,我收到以下消息:“值不能为null。参数名称:source”。你能就此提出建议吗?@Wilson Toh这种方法是经过测试的,但并不意味着它可以在所有环境下工作,而无需调整。你在这里是如何实现的?你能告诉我你正在使用的VB版本和.NETFramework版本(这里是VS15.7.6-FW4.7.1)吗?另外,生成错误的指令是什么(一步一步地调试以找出错误)。——此时在
MonitorID
ConvertToString()
方法中没有空检查。如果其中一个对象为null,则不会对其进行处理。我将对此进行编辑。@Wilson Toh注意,旧版本的VB.Net无法处理此语法
。InstanceName=moMonitor(“InstanceName”)?.ToString()
。它必须重写为:
.InstanceName=If(moMonitor(“InstanceName”)为Nothing,String.Empty,CType(moMonitor(“InstanceName”),String))
。其他两个可为null的字符串结果也是如此。感谢Jimi,它确实是VB.net的旧版本。我可以在更改后运行代码。谢谢
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