go采集注册表

复制代码
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 等)。

注意事项

  1. 权限问题:

    • 某些注册表键需要管理员权限才能访问。如果权限不足,程序会报错。
  2. 兼容性问题:

    • 不同版本的 Windows 系统中,注册表结构可能略有不同。
  3. 修改注册表的风险:

    • 读取注册表通常是安全的,但写入操作可能会对系统稳定性产生影响,请小心使用。
相关推荐
我是坏垠22 分钟前
Crypto、Cipher与Password:Java加密开发的三个核心概念
java·开发语言·python
white_ant41 分钟前
JDK LTS 版本升级迁移注意事项大全
java·开发语言
Bobolink_1 小时前
跨境业务网络环境评估,“干净、一致、独享”三个关键指标
开发语言·网络·php·跨境网络·网络环境
你怎么知道我是队长1 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
xingke1 小时前
C 语言多文件编程:(一)头文件、extern、编译链接
c语言·开发语言·多文件
戮漠summer2 小时前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
jinyishu_2 小时前
C++ string使用方法
开发语言·c++
EW Frontier2 小时前
三级跳突破864维动作空间——QMIX-Hierarchical多无人机协同通信方法全解析【附python代码】
开发语言·python·无人机·强化学习·通信资源分配
名字还没想好☜2 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
乐观勇敢坚强的老彭2 小时前
C++浮点数使用注意事项
开发语言·c++