我正在尝试使用VBA从URL要求密码的位置下载股票文件。
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
mainUrl = "https://wmsukprd.ab-inbev.com/core/Default.html"
fileUrl = "https://wmsukprd.ab-
inbev.com:30004/SupplyChainAdvantage/WAAdvantageDashboard
/ReportPageExport.ashx/ExportDownload?
id=1503&WH_ID=24&Item_Number=%25&Location_ID=%25&hu_id=%25&lot_number=
%25&serial_number=%25&_ww_export_id=d231eb2c-64ad-4ce7-82ca-d53c14ae1f69"
filePath = "C:\Users\barbeavi\Desktop\Samlesbury\Stock.csv"
myuser = "my login"
mypass = "******"
strAuthenticate = "start-url=%2F&user=" & myuser & "&password=" & mypass &
"&switch=Log+In"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
WHTTP.Open "POST", mainUrl, False
WHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.Send strAuthenticate
'GET direct file url
WHTTP.Open "GET", fileUrl, False
WHTTP.Send
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
'Save the file
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
我收到消息错误
运行时错误'-2147012866(80072efe)':
与服务器的连接异常终止
在以下行上:
WHTTP.Send strAuthenticate
问题可能出在HTTP S 上,因为我在不安全的页面上尝试了相同的代码,并且在这里可以正常工作。
答案 0 :(得分:0)
如果您在Windows 7或8上遇到此问题,则很可能与VBA使用SSL协议发送数据有关,该数据被仅接受TLS的服务器丢弃。
一段时间以来,我一直在Windows 7客户端上遇到TLS问题,并根据下面概述的Microsoft文章进行了一轮修复:
步骤1。获取Microsoft更新KB3140245: 下载相关的(32位或64位用户的Windows版本) Microsoft Security Protocol Update并安装(如果尚未安装)。
步骤2。下载Microsoft Easy Fix: 从以下位置下载Microsoft“轻松修复” Microsoft Support Article,然后执行以将TLS 1.1+设置为默认值。
但是,后来,我又遇到了类似的问题,这使我意识到Microsoft页面上的修复工具不会设置所有注册表项(缺少SChannel注册表项)。因此,我设法通过设置“ Internet选项”和“ SChannel”将一些脚本放在一起以进行完整修复。需要添加TLS1.1 / 1.2的SChannel注册表项,以默认情况下为Winhttp设置启用TLS。
WinHttp键:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
==> DWORD DefaultSecureProtocols=0x00000A00 (32-bits and 64-bits)
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
==> DWORD DefaultSecureProtocols=0x00000A00 (64-bits)
频道键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client
==> DWORD DisabledByDefault=0x00000000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client
==> DWORD DisabledByDefault=0x00000000
全面修复:Microsoft修补程序不能修复所有注册表项,以更新WinHTTP默认值并跳过SChannel项。因此,如果两步修复abpve无法解决问题,则该github项目包含用于下载和应用上面列出的所有必需的注册表修改的powershell脚本,并且可能对更全面的一次性修复有所帮助:Winttp-TLS