2

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

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

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

如果不出意外,如果我自己能够将它添加到go-winapi或类似的库中,我会回到这里回答这个问题(如果没有其他人回答)。

4

3 回答 3

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
}
于 2012-05-31T11:52:20.127 回答
3

这是一些示例

https://github.com/axgle/go/tree/master/regedit

于 2012-05-15T10:16:03.053 回答
0

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

WMIC:使用注册表描述了如何通过 Windows 中的 WMIC 命令行工具执行此操作。这可以适用于任何可以与 WMI 交互的编程环境。

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

于 2012-05-23T08:52:21.980 回答