golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息
package main
import (
"fmt"
"regexp"
"github.com/StackExchange/wmi"
"github.com/shirou/gopsutil/v3/disk"
)
// 定义 WMI 类结构体
type Win32_LogicalDiskToPartition struct {
Antecedent string
Dependent string
}
// 逻辑盘
type Win32_LogicalDisk struct {
DeviceID string `json:"deviceId"`
FreeSpace string `json:"freeSpace"`
FileSystem string `json:"fileSystem"`
Name string `json:"name"`
Size string `json:"size"`
Description string `json:"description"`
DriveType int `json:"driveType"`
VolumeName string `json:"VolumeName"`
}
type Win32_DiskDriveToDiskPartition struct {
Antecedent string
Dependent string
}
type Win32_DiskDrive struct {
DeviceID string
MediaType string
}
type DiskInfo struct {
DeviceID string `json:"deviceId"`
FreeSpace string `json:"freeSpace"`
FileSystem string `json:"fileSystem"`
Name string `json:"name"`
Size string `json:"size"`
Description string `json:"description"`
VolumeName string `json:"VolumeName"`
}
func GetDiskInfo() map[string]string {
var drives []Win32_DiskDrive
wmi.Query("SELECT DeviceID, MediaType FROM Win32_DiskDrive", &drives)
DiskInfo := make(map[string]string)
for _, disk := range drives {
var deviceID string
fmt.Sscanf(disk.DeviceID, `\\.\%s`, &deviceID)
if disk.MediaType == "Fixed hard disk media" {
DiskInfo[deviceID] = "本地磁盘"
} else {
DiskInfo[deviceID] = "外接设备"
}
}
return DiskInfo
}
func getDriveInfo(drive string) DiskInfo {
var logicalList []Win32_LogicalDisk
sqlStr := fmt.Sprintf(`Select * from Win32_LogicalDisk where Name="%s"`, drive)
wmi.Query(sqlStr, &logicalList)
deviceInfo := DiskInfo{
Name: drive,
Size: "0",
FreeSpace: "0",
Description: "外接硬盘",
FileSystem: logicalList[0].FileSystem,
DeviceID: logicalList[0].DeviceID,
VolumeName: logicalList[0].VolumeName,
}
Usag, err := disk.Usage(drive)
if err == nil {
deviceInfo.Size = fmt.Sprintf("%d", Usag.Total/1024/1024)
deviceInfo.FreeSpace = fmt.Sprintf("%d", Usag.Free/1024/1024)
}
return deviceInfo
}
func GetUSBList() []DiskInfo {
var logicalToPartitions []Win32_LogicalDiskToPartition
var diskToPartitions []Win32_DiskDriveToDiskPartition
var USBList []DiskInfo
// 查询 Win32_LogicalDiskToPartition
wmi.Query("SELECT Antecedent, Dependent FROM Win32_LogicalDiskToPartition", &logicalToPartitions)
// 查询 Win32_DiskDriveToDiskPartition
wmi.Query("SELECT Antecedent, Dependent FROM Win32_DiskDriveToDiskPartition", &diskToPartitions)
DiskInfo := GetDiskInfo()
// 输出关联的结果
for _, ltp := range logicalToPartitions {
for _, dtp := range diskToPartitions {
if ltp.Antecedent == dtp.Dependent {
re := regexp.MustCompile(`DeviceID="([^"]+)"`)
match := re.FindStringSubmatch(dtp.Antecedent)
if len(match) > 1 {
var deviceID string
fmt.Sscanf(match[1], `\\\\.\\%s`, &deviceID)
if DiskInfo[deviceID] == "外接设备" {
re := regexp.MustCompile(`DeviceID="([^"]+)"`)
match = re.FindStringSubmatch(ltp.Dependent)
if len(match) > 1 {
USBList = append(USBList, getDriveInfo(match[1]))
}
}
}
}
}
}
return USBList
}
func main() {
fmt.Printf("%+v\n", GetUSBList())
}