package main
import (
"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 和 PID
parts := 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 + `\` + subKey
subK, 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 + `\` + subKey
deviceK, 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 + `\` + deviceSubKey
infoK, 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 系统中,注册表结构可能略有不同。
修改注册表的风险:
- 读取注册表通常是安全的,但写入操作可能会对系统稳定性产生影响,请小心使用。