通过Go写入Windows注册表

时间:2012-05-15 06:46:49

标签: windows winapi registry go

我需要通过Go写入Windows注册表,但无法找到这样做的机制。

我发现https://github.com/lxn/go-winapi advapi32.go 文件中提供对注册表的只读访问权限。我已经提交了一份错误报告,要求能够写入注册表,以便将其作为未来某人的愿望清单或任务列表。

我认为这种能力甚至可能不存在于现有的Go库中,并且需要创建它。关于它已经存在的可能性,我在这里问。如果它不存在但您有兴趣增强 go-winapi 或其他类似的库,请执行。或者,如果您知道写入注册表背后的机制,那么共享该信息以便我(或其他人)可以将其作为 go-winapi 库的补丁工作当然会受到赞赏。

如果没有别的,我会回到这里回答这个问题(如果没有其他人这样做的话),如果我能够将其添加到 go-winapi 或类似的库中。< / p>

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

bitbucket.org/kardianos/service/src/service_windows.go找到,有Windows注册码和(奖励!)Windows服务管理代码。以下是该代码的示例:

var regSetKeyValueExProc = advapi.MustFindProc("RegSetValueExW")
func regSetKeyValue(h syscall.Handle, keyName string, data interface{}) error {
        var dataPtr, dataLen, dataType uintptr
        switch v := data.(type) {
        case uint32:
                dataPtr, dataLen = uintptr(unsafe.Pointer(&v)), 4
                dataType = _REG_DWORD
        case string:
                // The comment on MSDN regarding escaping back-slashes, are c-lang specific.
                // The API just takes a normal NUL terminated string, no special escaping required.
                dataPtr, dataLen = StringToUTF16PtrLen(v)
                dataType = _REG_SZ
        }
        r0, _, e1 := regSetKeyValueExProc.Call(
                uintptr(h),
                uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(keyName))),
                0,
                dataType,
                dataPtr,
                dataLen,
        )
        if r0 != 0 {
                return e1
        }
        return nil
}

答案 2 :(得分:0)

另一种选择是使用WMI来读/写注册表,也可以通过Go访问。

WMIC: Work with the registry描述了如何通过Windows中的WMIC命令行工具执行此操作。这可以适用于任何可以与WMI连接的编程环境。

我将使用user1391070的答案作为标记答案,但这可能会帮助需要进入WMI路线的人。