package mainimport ("fmt""golang.org/x/sys/windows/registry""log""os""strconv""strings"
)func USBSTOR_Enum() {// 打开注册表键keyPath := `SYSTEM\CurrentControlSet\Services\USBSTOR\Enum`k, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.QUERY_VALUE)if err != nil {log.Fatalf("无法打开注册表键 %s: %v", keyPath, err)}defer k.Close()// 获取 U 盘数量count, _, err := k.GetIntegerValue("Count")if err != nil {log.Fatalf("无法获取 U 盘数量: %v", err)}if count < 1 {fmt.Println("没有检测到 U 盘!")os.Exit(0)}// 遍历每个 U 盘的信息fmt.Printf("\n检测到 %d 个 U 盘,按插入顺序输出信息:\n\n", count)for i := 0; i < int(count); i++ {valueName := strconv.Itoa(i)info, _, err := k.GetStringValue(valueName)if err != nil {log.Printf("无法获取键值 %s 的信息: %v", valueName, err)continue}// 提取 SN、VID 和 PIDparts := strings.Split(info, "\\")if len(parts) < 3 {log.Printf("无法解析设备信息: %s", info)continue}sn := parts[2]pvid := parts[1]vid := strings.Split(strings.Split(pvid, "&")[0], "_")[1]pid := strings.Split(strings.Split(pvid, "&")[1], "_")[1]// 打印信息fmt.Printf("U 盘 %d:\n", i+1)fmt.Printf(" SN 码: %s\n", sn)fmt.Printf(" VID: %s\n", vid)fmt.Printf(" PID: %s\n\n", pid)}
}// 采集计算机名称
func getComputerName() {keyPath := `SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName`k, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.QUERY_VALUE)if err != nil {log.Printf("无法获取计算机名称: %v", err)return}defer k.Close()name, _, err := k.GetStringValue("ComputerName")if err != nil {log.Printf("无法读取 ComputerName 值: %v", err)return}fmt.Printf("计算机名称: %s\n", name)
}// 采集已安装软件信息
func getInstalledSoftware() {keyPath := `SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall`k, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.ENUMERATE_SUB_KEYS)if err != nil {log.Printf("无法打开已安装软件注册表路径: %v", err)return}defer k.Close()subKeys, err := k.ReadSubKeyNames(-1)if err != nil {log.Printf("无法读取子键名称: %v", err)return}fmt.Println("已安装的软件列表:")for _, subKey := range subKeys {subKeyPath := keyPath + `\` + subKeysubK, err := registry.OpenKey(registry.LOCAL_MACHINE, subKeyPath, registry.QUERY_VALUE)if err != nil {continue}name, _, _ := subK.GetStringValue("DisplayName")version, _, _ := subK.GetStringValue("DisplayVersion")if name != "" {fmt.Printf(" 软件名称: %s, 版本: %s\n", name, version)}subK.Close()}
}// 采集 USB 设备信息
func getUSBDevices() {keyPath := `SYSTEM\CurrentControlSet\Enum\USB`k, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.ENUMERATE_SUB_KEYS)if err != nil {log.Printf("无法打开 USB 设备注册表路径: %v", err)return}defer k.Close()subKeys, err := k.ReadSubKeyNames(-1)if err != nil {log.Printf("无法读取 USB 设备子键: %v", err)return}fmt.Println("USB 设备信息:")for _, subKey := range subKeys {subKeyPath := keyPath + `\` + subKeydeviceK, err := registry.OpenKey(registry.LOCAL_MACHINE, subKeyPath, registry.ENUMERATE_SUB_KEYS)if err != nil {continue}deviceSubKeys, _ := deviceK.ReadSubKeyNames(-1)for _, deviceSubKey := range deviceSubKeys {deviceInfoPath := subKeyPath + `\` + deviceSubKeyinfoK, err := registry.OpenKey(registry.LOCAL_MACHINE, deviceInfoPath, registry.QUERY_VALUE)if err != nil {continue}deviceDesc, _, _ := infoK.GetStringValue("DeviceDesc")friendlyName, _, _ := infoK.GetStringValue("FriendlyName")if friendlyName == "" {friendlyName = deviceDesc}if friendlyName != "" {fmt.Printf(" 设备名称: %s\n", friendlyName)}infoK.Close()}deviceK.Close()}
}// 采集网络信息
func getNetworkInfo() {keyPath := `SYSTEM\CurrentControlSet\Services\Tcpip\Parameters`k, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.QUERY_VALUE)if err != nil {log.Printf("无法获取网络信息: %v", err)return}defer k.Close()hostName, _, _ := k.GetStringValue("Hostname")domain, _, _ := k.GetStringValue("Domain")fmt.Printf("网络信息:\n 主机名: %s\n 域名: %s\n", hostName, domain)
}// 采集硬件信息
func getHardwareInfo() {keyPath := `HARDWARE\DESCRIPTION\System`k, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.QUERY_VALUE)if err != nil {log.Printf("无法获取硬件信息: %v", err)return}defer k.Close()systemBiosDate, _, _ := k.GetStringValue("SystemBiosDate")systemBiosVersion, _, _ := k.GetStringValue("SystemBiosVersion")fmt.Printf("硬件信息:\n BIOS 日期: %s\n BIOS 版本: %s\n", systemBiosDate, systemBiosVersion)
}// 主函数:逐一采集信息
func main() {fmt.Println("正在采集系统信息...\n")// 采集各类信息getComputerName()getInstalledSoftware()getUSBDevices()getNetworkInfo()getHardwareInfo()USBSTOR_Enum()fmt.Println("\n信息采集完成。")
}
Windows 注册表是一个分层的配置数据库,存储了系统配置、用户偏好、设备信息等数据。以下是一些常见的注册表路径和对应的信息类别,供你参考和扩展:
1. 系统信息
-
路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
- 描述: 包含系统配置相关的信息。
- 示例:
ComputerName\ActiveComputerName
: 当前计算机名称。TimeZoneInformation
: 系统时区信息。
-
路径:
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System
- 描述: 存储硬件信息。
- 示例:
SystemBiosDate
: BIOS 日期。SystemBiosVersion
: BIOS 版本信息。
Windows 注册表是一个分层的配置数据库,存储了系统配置、用户偏好、设备信息等数据。以下是一些常见的注册表路径和对应的信息类别,供你参考和扩展:
1. 系统信息
-
路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
- 描述: 包含系统配置相关的信息。
- 示例:
ComputerName\ActiveComputerName
: 当前计算机名称。TimeZoneInformation
: 系统时区信息。
-
路径:
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System
- 描述: 存储硬件信息。
- 示例:
SystemBiosDate
: BIOS 日期。SystemBiosVersion
: BIOS 版本信息。
2. 软件安装信息
- 路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
- 描述: 存储当前计算机安装的软件信息。
- 示例:
- 每个子键对应一个已安装的软件,其下包含:
DisplayName
: 软件名称。DisplayVersion
: 软件版本。InstallLocation
: 软件安装路径。
- 每个子键对应一个已安装的软件,其下包含:
3. 开机自启动项
-
路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- 描述: 开机启动的全局程序。
- 示例:
- 每个值表示一个自启动程序:
- 键名:程序名称。
- 键值:程序路径。
- 每个值表示一个自启动程序:
-
路径:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- 描述: 当前用户的开机启动项。
4. USB 设备历史
- 路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
- 描述: 记录历史插入的 USB 设备信息。
- 示例:
- 子键名称包含设备 VID 和 PID。
FriendlyName
: 设备友好名称。DeviceDesc
: 设备描述。
5. 网络信息
-
路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
- 描述: 存储网络配置信息。
- 示例:
Hostname
: 主机名。Domain
: 域名。DhcpIPAddress
: DHCP 分配的 IP 地址。
-
路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters
- 描述: NetBIOS 网络信息。
6. 电源设置
- 路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power
- 描述: 电源管理设置。
- 示例:
HibernateEnabled
: 是否启用休眠。CsEnabled
: 是否启用连接待机。
7. 用户登录信息
- 路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI
- 描述: 存储用户登录界面相关设置。
- 示例:
LastLoggedOnUser
: 最近登录的用户名。
8. 计划任务
- 路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree
- 描述: 存储计划任务的基本信息。
- 示例:
- 子键名对应任务名称,包含任务的触发条件和配置。
9. 安全与防火墙
- 路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy
- 描述: Windows 防火墙相关配置。
- 示例:
StandardProfile
: 默认防火墙规则。DomainProfile
: 域环境防火墙规则。
10. 硬件信息
- 路径:
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP
- 描述: 映射设备与资源的信息。
- 示例:
Scsi
: 存储设备的配置信息。VIDEO
: 显卡设备信息。
11. 事件日志
- 路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
- 描述: 系统和应用程序事件日志的配置。
- 示例:
- 子键表示不同日志类型(如 Application、System 等)。
注意事项
-
权限问题:
- 某些注册表键需要管理员权限才能访问。如果权限不足,程序会报错。
-
兼容性问题:
- 不同版本的 Windows 系统中,注册表结构可能略有不同。
-
修改注册表的风险:
- 读取注册表通常是安全的,但写入操作可能会对系统稳定性产生影响,请小心使用。