需求:只允许指定优盘进行读写操作,非指定优盘则禁止
思路:
- 禁止所有优盘。
- 后台运行指定程序后,解除优盘禁止。
- 轮询接入的优盘,获取序列号,进行授权比对。
- 比对失败,则弹出优盘。
进入注册表编辑器。找到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()
}