我正在編寫一個簡單的 Go 實用程序,該實用程序向 Internet 發出一些 POST 請求,但我需要通過代理并在不知道用戶憑據的情況下使用 NTLM。我見過如下 CSharp 代碼:wc = new CookieWebClient();wc.UseDefaultCredentials = true;wc.Proxy = WebRequest.DefaultWebProxy;wc.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;在 Go 中,我設法確定了系統代理,感覺就像是 hack:import ( "net/http" "net/url" "strings" "golang.org/x/sys/windows/registry")func getSystemProxy() func(req *http.Request) (*url.URL, error) { var e error var k registry.Key var proxy *url.URL var v string // Open the "Internet Settings" registry key k, e = registry.OpenKey( registry.CURRENT_USER, strings.Join( []string{ "Software", "Microsoft", "Windows", "CurrentVersion", "Internet Settings", }, "\\", ), registry.QUERY_VALUE, ) if e != nil { return http.ProxyFromEnvironment } defer k.Close() // Read the "ProxyServer" value v, _, e = k.GetStringValue("ProxyServer") if (e != nil) || (v == "") { return http.ProxyFromEnvironment } // Get the http= portion and fix it up v = strings.Split(v, ";")[0] v = strings.Replace(v, "=", "://", 1) // Parse url if proxy, e = url.Parse(v); e != nil { return http.ProxyFromEnvironment } return http.ProxyURL(proxy)}我一直無法找到與 CSharp 的https://docs.microsoft.com/en-us/dotnet/api/system.net.credentialcache.defaultnetworkcredentials?view=netcore-3.1等效的 Go 。我找到了https://github.com/Azure/go-ntlmssp但這需要我對我沒有的用戶憑據進行硬編碼,并且我需要為每個用戶編譯一個新的二進制文件,我會這樣做不想做。我正在尋找 0 配置解決方案。我希望這盡可能動態。如果 CSharp 能做到,為什么 Go 不能呢?
1 回答

寶慕林4294392
TA貢獻2021條經驗 獲得超8個贊
我被告知我可以使用 WinHTTP 或 WinInet 來實現這一點。我將使用golang.org/x/sys/windows
包并從 DLL 中調用程序。或者,有人告訴我,我可以github.com/go-ole/go-ole
通過 COM 對象使用和使用 WinHTTP,就像在另一個 SO 問題中一樣:Windows system credentials in Go HTTP NTLM requests。
更新:我最終決定選擇 WinInet,并創建了自己的包 (gitlab.com/mjwhitta/win/wininet),其中包含一個 http.Client,可用于發出 GET 和 POST 請求。有關如何使用它的示例,請參閱自述文件。如果我有需要,我可能會在未來擴展它。歡迎請求請求。
最后更新:男孩,我覺得自己很愚蠢。WinInet 不希望為你做 NTLM ......所以我將它移植到 WinHttp (gitlab.com/mjwhitta/win/winhttp)。
- 1 回答
- 0 關注
- 137 瀏覽
添加回答
舉報
0/150
提交
取消