问题
每当我们尝试从Web服务器读取文件内容时,Msxml2.ServerXMLHTTP都会一直返回401 - 未经授权的错误。源服务器正在运行IIS6,使用NTLM集成登录。
此流程之前已成功使用,但仅限于从外部网站而非内部网站提取XML文件。
运行脚本的服务器的注册表中的代理设置也已更新,以绕过相关网站,但无济于事。
VBScript中标识的所有路径都已经过检查和测试,并且是正确的。
运行脚本的用户对脚本中引用的所有位置都具有正确的读/写权限。
需要解决方案
确定HTTP 401 Unauthorized消息的原因,以便脚本按预期工作。
描述
我们的组织运营内部网,内容被复制到我们每个远程站点的服务器。这可确保这些站点能够持续快速访问重要信息,文档和数据,即使在连接失败的情况下也是如此。
我们正在改进表格的列表和管理(那些为特定任务必须填写的那些讨厌的纸张)。这涉及建立我们所有表格的数据库。
但是,由于组织不够聪明,无法在每个站点上投资MSSQL Server实例,因此无法复制数据库并从本地SQL服务器访问它。
为了解决这个问题,我构建了一系列显示所需数据的视图(ASP页面)。然后我打算通过VBScript使用Msxml2.ServerXMLHTTP,这样我就可以读取生成的页面并将输出保存到服务器上的静态文件中。
从那里,现有的复制过程可以将这些文件流式传输到站点 - 用户不知道他们正在查看恰好是从数据库输出生成的静态页面。
代码
' Forms - Static Page Generator
' Implimented 2011-02-15 by Michael Harris
' Purpose: To download the contents of a page, and save that page to a static file.
' Target category: 1 (Contracts)
' Target Page:
' http://sharename.fpc.wa.gov.au/corporate/forms/generator/index.asp
' Target path: \\servername\sharename\corporate\forms\index.asp
' Resulting URL: http://sharename.fpc.wa.gov.au/corporate/forms/index.asp
' Remove read only
' Remove read only flag on file if present to allow editing
' If file has been set to read only by automated process, turn off read only
Const READ_ONLY = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("\\server\sharename\corporate\forms\index.asp")
If objFile.Attributes AND READ_ONLY Then
objFile.Attributes = objFile.Attributes XOR READ_ONLY
End If
Dim webObj, strURL
Set webObj = CreateObject("Msxml2.ServerXMLHTTP")
strURL = "http://sharename.fpc.wa.gov.au/corporate/forms/generator/index.asp"
webObj.Open "GET", strURL
webObj.send
If webObj.Status=200 Then
Set objFso = CreateObject("Scripting.FileSystemObject")
Set txtFile = objFso.OpenTextFile("file:\\servername.fpc.wa.gov.au\sharename\corporate\forms\index.asp", 2, True)
txtFile.WriteLine webObj.responseText
txtFile.close
ElseIf webObj.Status >= 400 And webObj.Status <= 599 Then
MsgBox "Error Occurred : " & webObj.Status & " - " & webObj.statusText
Else
MsgBox webObj.ResponseText
End If
答案 0 :(得分:1)
替换你的行:
webObj.Open "GET", strURL
使用:
webObj.Open "GET", strURL, False, "username", "password"
在大多数情况下,401 Unauthorized表示您尚未提供凭据。此外,您应指定False以表示您不需要异步模式。
答案 1 :(得分:0)
我首先测试您是否可以通过在(A)上运行代码的同一服务器X上的普通浏览器访问您的URL。我会尝试从另一台PC到达网址。从来没有用过这个网址,但是在与服务器X(B)相同的网络中。
如果B工作但A不工作,我会怀疑由于某种原因你的源服务器(即那个服务于url的服务器)由于某种原因阻塞了服务器X.检查II6和NTLM的安全设置。
如果A和B都不起作用,那么源服务器通常会出现问题(即它会阻止所有内容或NTML不允许你进入)。
如果A有效(B无关紧要),问题必须在代码中的某处。在这种情况下,我会建议fiddler。该工具可以实时为您提供浏览器和代码的HTTP请求。然后你可以比较两者。这应该至少给你一个非常强烈的提示(如果不是立即给你)解决方案。
答案 2 :(得分:0)
听起来好像O.P.在注册表中使用了正确的代理设置(http://support.microsoft.com/kb/291008解释了为什么代理配置会解决这个问题)。较新版本的ServerXMLHTTP有一个setProxy方法,可用于在代码中设置必要的代理配置。
在上面的O.P.代码中,创建webObj后,以下代码行将正确设置代理:
webObj.setProxy 2, "0.0.0.0:80", "*.fpc.wa.gov.au"
如果使用代理配置代码,并且目标URL绕过该代理,则ServerXMLHTTP将传递运行代码的用户的凭据。由于您仍在绕过代理,因此可以将其设为虚拟值"0.0.0.0:80"
,并确保您的目标网址已在旁路列表"*.fpc.wa.gov.au"