go采集注册表

发布于:2025-02-10 ⋅ 阅读:(20) ⋅ 点赞:(0)
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. 修改注册表的风险:

    • 读取注册表通常是安全的,但写入操作可能会对系统稳定性产生影响,请小心使用。

网站公告

今日签到

点亮在社区的每一天
去签到