Error .NET Framework 4.8.x 到 Framework .NET 6.x GetObject("Winmgmts:").ExecQuery

问题描述 投票:0回答:0

我已经将我的项目从 4.8.x 升级到 .NET Framework 6.x 我可以启动它但不能调用一个 WMI 方法

GetObject("Winmgmts:").ExecQuery("SELECT * FROM Win32_LogicalDisk")

.这里是在 4.8.x 下运行的源代码

        Dim strHDD As String = ""
        Dim colDisks As Object
        Dim objDisk As Object

        Try
            colDisks = GetObject("Winmgmts:").ExecQuery("SELECT * FROM Win32_LogicalDisk")

            For Each objDisk In colDisks
                Application.DoEvents()
                Select Case objDisk.DriveType

                    Case 3
                        'lstServerMessage.Items.Add("-- HDD INFO --")
                        'lstServerMessage.Items.Add("Bezeichnung: " & objDisk.Caption & " - " & objDisk.VolumeName & " - Typ: Festplatte")
                        'lstServerMessage.Items.Add("Seriennummer: " & objDisk.VolumeSerialNumber)
                        'lstServerMessage.Items.Add("Dateisystem: " & objDisk.FileSystem)
                        'lstServerMessage.Items.Add("-- ENDE --")
                        'lstServerMessage.Items.Add("")
                        strHDD = objDisk.VolumeSerialNumber
                        Exit For
                End Select
            Next
      Return strHDD
        Catch ex As Exception           
            Return "-1"
        End Try

异常部分中的错误消息:“{”找不到类型为“SWbemServicesEx”的公共成员“ExecQuery”。}”(没有谷歌搜索结果)。

我正在运行 Windows 11,但 .net framework 4.8.x 可以正常运行。

它应该运行直到找到 Drivetype = 3 并返回“VolumeSerial”。

我将在 VB.NET Framework 中收到的错误消息是“{”未找到类型为“SWbemServicesEx”的公共成员“ExecQuery”。}”

编辑:

nuget 包 https://www.nuget.org/packages/System.Management/ 提供了我们所需要的。 “提供对有关 Windows Management Instrumentation (WMI) 基础结构的系统、设备和应用程序的丰富管理信息和管理事件的访问。”

解决方案

' working @.net framework 6.x - 7.x
                Dim colDisks As ManagementObjectSearcher = New ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk")
' working up to 4.8.x / WIN11
            'colDisks = GetObject("Winmgmts:").ExecQuery("SELECT * FROM Win32_LogicalDisk")

            For Each objDisk In colDisks.Get
                Application.DoEvents()
                Select Case objDisk("DriveType")

                    Case 3
                        'lstServerMessage.Items.Add("-- HDD INFO --")
                        'lstServerMessage.Items.Add("Bezeichnung: " & objDisk.Caption & " - " & objDisk.VolumeName & " - Typ: Festplatte")
                        'lstServerMessage.Items.Add("Seriennummer: " & objDisk.VolumeSerialNumber)
                        'lstServerMessage.Items.Add("Dateisystem: " & objDisk.FileSystem)
                        'lstServerMessage.Items.Add("-- ENDE --")
                        'lstServerMessage.Items.Add("")
                        strHDD = objDisk("VolumeSerialNumber")
                        Exit For
                End Select
            Next
.net vb.net wmi wmi-query
© www.soinside.com 2019 - 2024. All rights reserved.