go采集注册表

devtools/2025/1/17 19:00:39/
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 等)。

注意事项

  1. 权限问题:

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

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

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

http://www.ppmy.cn/devtools/151337.html

相关文章

双线性插值算法:原理、实现、优化及在图像处理和多领域中的广泛应用与发展趋势(一)

一、头文件和命名空间 #include <opencv2/opencv.hpp>&#xff1a;这是 OpenCV 库的头文件&#xff0c;它包含了许多用于图像处理、计算机视觉任务的类和函数。OpenCV 是一个强大的开源计算机视觉库&#xff0c;提供了大量的工具和算法&#xff0c;可用于图像的读取、处…

jenkins-系统配置概述

一. 引文&#xff1a; Jenkins除了强大的功能插件实现的持续交付集成外&#xff0c; 本身也是有一些比较重要的可配项。 接下来我们来看一看。 配置入口: 系统管理-->系统设置 二. 基础配置&#xff1a; 1.主目录(home directory): Jenkins所有的数据文件存放路径(可通过…

LeetCode - #183 Swift 实现查询未下订单的客户

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时无法使用JDK8?

使用新版IDEA时发现&#xff1a; 可以看到IDEA在创建Springboot项目时无法使用jdk8了。 是因为 Spring Boot 官方不再支持 Spring Boot 的 2.x 版本了&#xff0c;之后全力维护 3.x&#xff1b;而 Spring Boot 3.x 对 JDK 版本的最低要求是 17&#xff01; 不使用官方提供的 S…

docker虚拟机平台未启用问题

在终端中输入如下代码&#xff0c;重启电脑即可 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 对于Docker Desktop - Unexpected WSL error问题 参考链接 解决WSL2与docker冲突问题

GPU 硬件原理架构(一)

这张费米管线架构图能看懂了&#xff0c;整个GPU的架构基本就熟了。市面上有很多GPU厂家&#xff0c;他们产品的架构各不相同&#xff0c;但是核心往往差不多&#xff0c;整明白一了个基本上就可以触类旁通了。下面这张图信息量很大&#xff0c;可以结合博客GPU 英伟达GPU架构回…

实现linux硬盘smart检测

一、下载交叉编译libatasmart库 下载链接&#xff1a;https://www.linuxfromscratch.org/blfs/view/svn/general/libatasmart.html libatasmart库编译依赖libudev库&#xff0c;交叉编译器前先准备依赖的libudev: 设置libudev的环境变量&#xff0c;并通过configure编译文件生…

【Linux】9.Linux第一个小程序进度条

文章目录 Linux第一个小程序&#xff0d;进度条相关知识创建程序1. 程序原理2. 基础程序原理实现 井号进度条代码实现箭头进度条代码实现多重进度条代码实现 Linux第一个小程序&#xff0d;进度条 相关知识 特殊符号&#xff1a; $ 和 $^ 回车换行&#xff1a; 回车和换行其实…