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())
}
相关推荐
J不A秃V头A2 分钟前
Python爬虫:获取国家货币编码、货币名称
开发语言·爬虫·python
SRY122404193 小时前
javaSE面试题
java·开发语言·面试
__AtYou__3 小时前
Golang | Leetcode Golang题解之第557题反转字符串中的单词III
leetcode·golang·题解
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
一丝晨光4 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
程序猿-瑞瑞5 小时前
11 go语言(golang) - 数据类型:结构体
开发语言·golang