golang获取u盘序列号(通过读取注册表实现)

仅供参考
package main

import (
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"

	registry "github.com/golang/sys/windows/registry"
)

func main() {
	//查询插入的u盘个数
	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SYSTEM\CurrentControlSet\Services\USBSTOR\Enum`, registry.QUERY_VALUE)
	if err != nil {
		log.Fatal(err)
	}
	defer k.Close()

	n, _, err := k.GetIntegerValue("Count")
	if err != nil {
		log.Fatal(err)
	}
	if n < 1 {
		fmt.Println("没有检测到u盘!")
		os.Exit(-1)
	}

	//查询u盘序列号
	var sn, pvid, vid, pid string
	information, _, err := k.GetStringValue(strconv.Itoa(0))
	strn := strconv.FormatUint(n, 10) //n是uint64类型,先转成string
	nInt, _ := strconv.Atoi(strn)     //再转成int类型
	if n > 1 {
		fmt.Printf("\n检测到多个u盘,按插入顺序输出u盘信息\n\n")
	}
	for i := 0; i < nInt; i++ {
		information, _, err = k.GetStringValue(strconv.Itoa(i))
		if err != nil {
			log.Fatal(err)
		}
		sn = strings.Split(information, "\\")[2]
		pvid = strings.Split(information, "\\")[1]
		vid = strings.Split(pvid, "&")[0]
		vid = strings.Split(vid, "_")[1]
		pid = strings.Split(pvid, "&")[1]
		pid = strings.Split(pid, "_")[1]
		fmt.Println("当前u盘sn码:", sn)
		fmt.Println("当前u盘vid: ", vid)
		fmt.Println("当前u盘pid: ", pid)
		fmt.Println("")
	}
}


参考链接: https://godoc.org/golang.org/x/sys/windows/registry

20190318更新,此方法不适于慧荣主控的u盘。

转载于:https://www.cnblogs.com/sherlock-merlin/p/10197581.html

### 回答1: 在Golang获取CPU序列号需要使用一些操作系统相关的功能。首先,需要导入相关的包: ```go import ( "fmt" "os/exec" "strings" ) ``` 然后,在函数中使用命令行工具获取CPU序列号。根据操作系统的不同,使用不同的命令行工具。以下是在Windows和Linux操作系统获取CPU序列号的示例代码: ```go func getCPUSerialNumber() (string, error) { var cmd *exec.Cmd var output []byte var err error if strings.Contains(strings.ToLower(runtime.GOOS), "windows") { // For Windows cmd = exec.Command("wmic", "cpu", "get", "processorid") output, err = cmd.Output() if err != nil { return "", err } } else if strings.Contains(strings.ToLower(runtime.GOOS), "linux") { // For Linux cmd = exec.Command("cat", "/proc/cpuinfo") output, err = cmd.Output() if err != nil { return "", err } } // Parse CPU serial number from the output lines := strings.Split(string(output), "\n") for _, line := range lines { if strings.Contains(line, "ProcessorId") { fields := strings.Fields(line) if len(fields) >= 2 { return fields[1], nil } } } // Unable to find CPU serial number return "", fmt.Errorf("Failed to get CPU serial number") } ``` 这个函数首先根据操作系统类型选择使用Windows的wmic命令或者Linux的cat命令获取CPU信息。然后从输出中解析出CPU序列号并返回。 注意,这段代码假设用户已经安装了相应的命令行工具(如wmic),并且具有执行权限。另外,对于其他操作系统,可能需要使用不同的命令或者API来获取CPU序列号。 ### 回答2: 在Golang中,可以使用`syscall`包来获取CPU序列号。以下是一个简单的示例代码: ```go package main import ( "fmt" "syscall" "unsafe" ) func main() { info := &syscall.Systeminfo{} err := syscall.GetSystemInfo(info) if err != nil { fmt.Println("获取系统信息失败:", err) return } cpuInfo := make([]uint32, 20) procId, _, _ := syscall.MustLoadDLL("kernel32.dll").MustFindProc("GetVolumeInformationW") _, _, _ = procId.Call( uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("C:\\"))), 0, uintptr(unsafe.Pointer(&cpuInfo[0])), 0, 0, 0, 0, 0, ) serialNumber := []byte{} for _, i := range cpuInfo { if i == 0 { break } serialNumber = append(serialNumber, byte(i&0xff)) serialNumber = append(serialNumber, byte((i>>8)&0xff)) } fmt.Println("CPU序列号:", string(serialNumber)) } ``` 这个代码片段通过`syscall`包中的`GetSystemInfo`函数获取系统信息,然后使用`GetVolumeInformationW`函数获取C盘的卷序列号。最终将卷序列号转换成字符串并打印出来。请注意,这个方法只适用于Windows操作系统。对于其他操作系统,需要使用不同的方法来获取CPU序列号。 ### 回答3: 在Golang获取CPU序列号可以通过使用一些系统库和函数来实现。以下是一种可能的方式: 首先,我们可以使用"syscall"包中的sysctl函数来获取与CPU相关的信息。sysctl函数可以通过查询系统指定的参数来获取这些信息。 接下来,我们需要使用"runtime"包中的GOMAXPROCS函数来获取当前系统上的CPU数量。 然后,我们可以使用C语言的代码来实现获取CPU序列号的功能。这可以通过在Go代码中使用"unsafe"和"C"包来实现。 具体代码如下: ```go package main import ( "fmt" "runtime" "syscall" "unsafe" ) const ( CTL_HW = 6 HW_MACHINE = 100 HW_MODEL = 107 ) func main() { var mib [2]int32 mib[0] = CTL_HW // 获取CPU序列号 mib[1] = HW_MODEL buf := make([]byte, 128) length := uint64(len(buf)) if syscall.Sysctl(mib[:], nil, &length, nil, 0) == nil { if length < 128 { if syscall.Sysctl(mib[:], buf, &length, nil, 0) == nil { fmt.Println("CPU序列号:", string(buf[:length-1])) } } } // 获取CPU核心数 fmt.Println("CPU 核心数:", runtime.GOMAXPROCS(0)) } ``` 这段代码首先使用sysctl函数获取CPU序列号并将其存储在缓冲区中。然后,通过调用runtime包中的GOMAXPROCS函数获取CPU核心数。最后,打印出获取的CPU序列号和CPU核心数。 请注意,由于涉及到操作系统底层的功能,代码的可移植性可能较差,可能在不同的操作系统上有不同的实现方式。因此,建议根据具体的操作系统进行适当的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值