在 Go (Golang) 中枚举注册表值

2024-02-16

我正在尝试使用 Go 枚举 Windows 注册表中的值列表,但遇到了一些麻烦。我尝试了两种方法:使用 Go 提供的syscall要调用的库RegEnumValue, 也使用 lxn 的 Windows API 包装器 https://github.com/lxn/win。在这两种情况下,我都遇到同样的问题。这是我正在使用的代码(当前正在使用 lxn 的 win 库):

var root win.HKEY
rootpath, _ := syscall.UTF16PtrFromString("HARDWARE\\DEVICEMAP\\SERIALCOMM")
fmt.Println(win.RegOpenKeyEx(win.HKEY_LOCAL_MACHINE, rootpath, 0, win.KEY_READ, &root))

var name_length uint32 = 72
var name *uint16
var key_type uint32
var lpData *byte
var lpDataLength uint32 = 72
var zero_uint uint32 = 0
fmt.Println(win.RegEnumValue(root, zero_uint, name, &name_length, nil, &key_type, lpData, &lpDataLength))

win.RegCloseKey(root)

在这种情况下,RegEnumValue始终返回代码 87,其中MSDN唯一的解释 http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx是“参数不正确”。

有谁有任何想法可以为我指明正确的方向吗?


也许有人发现这很有用:

const regKey = `SOFTWARE\Microsoft\Windows NT\CurrentVersion`

func getSettingsFromRegistry() (settings map[string]string, error) {
    settings = make(map[string]string)

    k, err := registry.OpenKey(registry.LOCAL_MACHINE, regKey, registry.QUERY_VALUE)
    if err != nil {
        
        return fmt.Errorf("open registry key %q: %w", regKey, err)
    }
    defer k.Close()

    params, err := k.ReadValueNames(0)
    if err != nil {
        return fmt.Errorf("read value names %q: %w", psaConfRegistry32, err)
    }

    for _, param := range params {
        val, err := getRegistryValueAsString(k, param)
        if err != nil {
            return fmt.Errorf("get value as string %q: %w", k, err)
        }
        settings[param] = val
    }

    self.Log.Printf("%#v\n", settings)
    return
}

func getRegistryValueAsString(key registry.Key, subKey string) (string, error) {
    valString, _, err := key.GetStringValue(subKey)
    if err == nil {
        return valString, nil
    }
    valStrings, _, err := key.GetStringsValue(subKey)
    if err == nil {
        return strings.Join(valStrings, "\n"), nil
    }
    valBinary, _, err := key.GetBinaryValue(subKey)
    if err == nil {
        return string(valBinary), nil
    }
    valInteger, _, err := key.GetIntegerValue(subKey)
    if err == nil {
        return strconv.FormatUint(valInteger, 10), nil
    }

    return "", fmt.Errorf("failed to get type for sub key %q", subKey)
}

REG_BINARY 值将类似于“\x01\x00\x00...”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Go (Golang) 中枚举注册表值 的相关文章

随机推荐

  • 苹果musickit用户令牌

    如何为 Apple musickit API 创建音乐用户令牌 每次执行 SKCloudServiceController requestPersonalizationToken forClientToken developerTokenS
  • 带参数的 WebView addJavascriptInterface 函数

    我已经向 WebView 添加了 JavaScript 接口 我可以使用所有没有参数的函数 但是当我从 JavaScript 给出参数时 WebView 不调用该函数 See Code JavaScript function getCell
  • 如何将段落与 Itext 对齐(对齐)?

    我有 2 条线 我想对齐 对齐 它们 我有这个代码 Paragraph p new Paragraph ANC fontFootData p setLeading 1 1 p setAlignment Element ALIGN JUSTI
  • EF 6 IsRequired() 允许空字符串

    在过去使用 EF5 和 EF4 版本的项目中 如果属性为 null 或空字符串 IsRequired 流畅 API 方法将引发 DbEntityValidationException 在我当前使用 EF6 的项目中 当字符串属性为空时 不会
  • 地图 V2 标记按下状态

    在 Maps V2 中 如何将标记设置为按下状态 setIcon 方法采用 BitmapDescriptor 我看不到一种传递 XML 选择器的方法 该选择器将给出按下和选择的状态 实现此目的的唯一方法是重写 OnMarkerClickLi
  • 如何在socket.io 1.0中存储客户端相关数据

    文档说 socket io 现在不支持 get set 可以存储客户端相关数据吗 io sockets on connection function client client on data function somedata clien
  • 限制对 Application Load Balancer 的访问的最佳方法是什么?

    理想情况下 我想锁定我的 ALB 以便只能通过 API 网关访问它 我研究了是否可以将 API 网关与入站规则关联 但是 我发现 API 网关无法与 IP 地址或安全组关联 我还研究了面向内部的 ALB 但我无法让这些工作 因为 VPC 链
  • HBase 扫描时出现 java.lang.NoClassDefFoundError

    我正在尝试运行 MapReduce 作业来扫描 HBase 表 目前我使用的是Cloudera 4 4附带的HBase 0 94 6版本 在我的程序中的某个时刻 我使用 Scan 并使用以下命令正确导入它 import org apache
  • EHCache如何实现其事务?

    这个问题可能听起来很模糊 但我试图理解 EHCache 事务能力的一般概念 假设我将 EHCache 配置为内存缓存 并且还将其配置为缓存MyObject EHCache是 否克隆实例MyObject我正在检索这是否是作为交易的一部分完成的
  • “飞行模式”打开时SIM状态的值是多少

    我想知道返回的SIM状态值是多少TelephonyManager getSimState http developer android com reference android telephony TelephonyManager htm
  • Jersey/JAXB:对 HTTP POST 和 GET 使用相同的 POJO,但在 JSON 响应中仅返回 GET 属性的子集。

    这似乎是另一件相当简单的事情 但我再次为如何做到这一点而苦苦挣扎 我有一个带有 Jersey JAXB 注释的 POJO 该注释具有与其关联的 HTTP POST 和 GET 方法 在 POJO 上执行 POST 时 请求正文以 JSON
  • 如何使用 NetBeans GUI Builder 包含自定义面板?

    我编写了一个扩展 JPanel 的类 是否可以在 NetBeans GUI Builder 中使用它并让它在所有自动代码生成过程中幸存下来 我已经使用 GUI 构建器中的自定义代码选项将对象实例化为新类 但似乎无法从 JPanel 更改声明
  • 单击按钮时 UITextField 不会结束编辑(委托 textFieldDidEndEditing )

    我有两个textFields在屏幕上和一个Submit button 用户在第一个文本字段中输入详细信息 然后在第二个文本字段中输入详细信息 我的要求是结束编辑Submit button单击并打印这些中的用户输入textFields 我在打
  • OkHttp3 返回超时异常

    我使用 okhttp3 作为网络库 使用 Node mongo 作为后端服务 有时 当我的应用程序启动时 它会显示超时异常 当我关闭应用程序并再次启动它时 它会从服务器获取数据 没有错误应用程序 但我想知道为什么显示超时异常 下面是我在列表
  • ggplot2 中的旋转和间距轴标签

    我有一个图 其中 x 轴是一个标签很长的因子 虽然可能不是理想的可视化 但现在我想简单地将这些标签旋转为垂直 我已经用下面的代码解决了这部分问题 但正如您所看到的 标签并不完全可见 data diamonds diamonds cut lt
  • 如何从控制台访问 Ember 数据存储?

    在 Ember 2 中 有谁知道如何获取对 Ember Store 的引用 以便对 javascript 控制台中的模型映射进行故障排除 本来可以通过App container lookup在 Ember 1 中 但这已经不存在了 而且很难
  • PhantomJS 和 iFrame

    我正在使用 phantomjs 1 5 和casperjs http casperjs org 用于我的功能测试 casper require casper create loadImages false casper start http
  • 在 Objective-C 中定义协议类别?

    在 Objective C 中 我可以使用类别向现有类添加方法 例如 interface NSString MyCategory BOOL startsWith NSString prefix end 是否也可以使用协议来做到这一点 即如果
  • ctorParameters.map 不是 angular2-mdl 中的函数

    我正在尝试将 Angular2 mdl 与 Angular CLI 一起使用 我导入了MdlModule在 app module ts 中 当我尝试使用时
  • 在 Go (Golang) 中枚举注册表值

    我正在尝试使用 Go 枚举 Windows 注册表中的值列表 但遇到了一些麻烦 我尝试了两种方法 使用 Go 提供的syscall要调用的库RegEnumValue 也使用 lxn 的 Windows API 包装器 https githu