繁体   English   中英

通过Go写入Windows注册表

[英]Write to Windows Registry via Go

我需要通过Go写入Windows注册表,但是无法找到执行此操作的机制。

我发现https://github.com/lxn/go-winapiadvapi32.go文件中提供对注册表的只读访问。 我已经提交了一个错误报告,要求也可以写入注册表,以便将来将其写入愿望清单或任务列表。

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

如果没有其他问题,如果我自己可以将其添加到go-winapi或类似的库中,那么我将回到这里回答此问题(如果没有其他人回答)。

可以在bitbucket.org/kardianos/service/src/service_windows.go上找到,这里还有有效的Windows注册表代码以及Windows Service管理代码。 这是该代码的示例:

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
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM