簡體   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