(原) 优盘管理思路

原创文章,请后转载,并注明出处。

需求:只允许指定优盘进行读写操作,非指定优盘则禁止

思路:

  1. 禁止所有优盘。
  2. 后台运行指定程序后,解除优盘禁止。
  3. 轮询接入的优盘,获取序列号,进行授权比对。
  4. 比对失败,则弹出优盘。

进入注册表编辑器。找到HEKY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\service\USBSTOR里面,找到名称为start的这个选项,讲它的值更改为4,就是禁止。2就是自动,3是手动。

这里是C#实现类似功能: https://blog.csdn.net/qq_25372599/article/details/80135723

VB实现对优盘控制: https://bbs.csdn.net/topics/280003308

VB 卸载USB设备/解锁文件 https://blog.csdn.net/chenhui530/article/details/1932917

这是Win下获取优盘及序列号信息,网上抄下来,未测试可行性。

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("")
	}
}

测试来看,至少注册表这个位置不能获取到正确信息,例如优盘数量。

用以下的程序可以获取磁盘盘符及占用空间。考虑通过WMI来解决需求。

package main
 
import (
    "fmt"
 
    "github.com/StackExchange/wmi"
)
 
type Storage struct {
    Name       string
    FileSystem string
    Total      uint64
    Free       uint64
}
 
type storageInfo struct {
    Name       string
    Size       uint64
    FreeSpace  uint64
    FileSystem string
}
 
func getStorageInfo() {
    var storageinfo []storageInfo
    var loaclStorages []Storage
    //Select * From Win32_USBHub
    err := wmi.Query("Select * from Win32_LogicalDisk", &storageinfo)
    if err != nil {
        return
    }
 
    for _, storage := range storageinfo {
        info := Storage{
            Name:       storage.Name,
            FileSystem: storage.FileSystem,
            Total:      storage.Size,
            Free:       storage.FreeSpace,
        }
        loaclStorages = append(loaclStorages, info)
    }
    fmt.Println("localStorages:", loaclStorages)
}
 
func main() {
    getStorageInfo()
}