我需要通过Go写入Windows注册表,但无法找到这样做的机制。
我发现https://github.com/lxn/go-winapi在 advapi32.go 文件中提供对注册表的只读访问权限。我已经提交了一份错误报告,要求能够写入注册表,以便将其作为未来某人的愿望清单或任务列表。
我认为这种能力甚至可能不存在于现有的Go库中,并且需要创建它。关于它已经存在的可能性,我在这里问。如果它不存在但您有兴趣增强 go-winapi 或其他类似的库,请执行。或者,如果您知道写入注册表背后的机制,那么共享该信息以便我(或其他人)可以将其作为 go-winapi 库的补丁工作当然会受到赞赏。
如果没有别的,我会回到这里回答这个问题(如果没有其他人这样做的话),如果我能够将其添加到 go-winapi 或类似的库中。< / p>
答案 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路线的人。