[英]Write to Windows Registry via Go
我需要通過Go寫入Windows注冊表,但是無法找到執行此操作的機制。
我發現https://github.com/lxn/go-winapi在advapi32.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.