golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息

golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息

golang 复制代码
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())
}
相关推荐
智商低情商凑4 小时前
Go学习之 - Goroutines和channels
开发语言·学习·golang
半桶水专家4 小时前
Go 语言时间处理(time 包)详解
开发语言·后端·golang
编程点滴4 小时前
Go 重试机制终极指南:基于 go-retry 打造可靠容错系统
开发语言·后端·golang
实心儿儿4 小时前
C++ —— 模板进阶
开发语言·c++
萧鼎5 小时前
Python PyTesseract OCR :从基础到项目实战
开发语言·python·ocr
二川bro5 小时前
第57节:Three.js企业级应用架构
开发语言·javascript·架构
sali-tec5 小时前
C# 基于halcon的视觉工作流-章62 点云采样
开发语言·图像处理·人工智能·算法·计算机视觉
这人很懒没留下什么7 小时前
SpringBoot2.7.4整合Oauth2
开发语言·lua
ZHOUZAIHUI7 小时前
WSL(Ubuntu24.04) 安装PostgreSQL
开发语言·后端·scala
欧阳x天7 小时前
C++入门(二)
开发语言·c++