0

问题

每次我们尝试从 Web 服务器读取文件 (ASP) 的内容时,Msxml2.ServerXMLHTTP 都会不断返回 401 - 未经授权的错误。

源服务器运行 IIS6,使用 NTLM 集成登录。

此过程以前已成功使用,但仅用于从外部网站提取 XML 文件,而不是从内部网站提取 XML 文件。

运行脚本的服务器注册表中的代理设置也已更新,以绕过相关网站,但无济于事。

VBScript 中标识的所有路径都经过检查和测试,并且是正确的。

运行脚本的用户对脚本中引用的所有位置具有正确的读/写权限。

需要解决方案

确定 HTTP 401 Unauthorized 消息的原因,以便脚本按预期工作。

描述

我们的组织运营着一个内部网,其中的内容被复制到我们每个远程站点的服务器上。这确保了这些站点即使在失去连接的情况下也能继续快速访问重要信息、文档和数据。

我们正在改进表格的列表和管理(那些必须为特定任务填写的讨厌的纸)。这涉及建立我们所有表格的数据库。

但是,由于该组织还不够聪明,无法在每个站点上投资 MSSQL Server 实例,因此无法选择复制数据库并从本地 SQL Server 访问它。

为了解决这个问题,我构建了一系列显示所需数据的视图(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
4

3 回答 3

1

替换你的行:

webObj.Open "GET", strURL 

和:

webObj.Open "GET", strURL, False, "username", "password"

在大多数情况下,401 Unauthorized 意味着您没有提供凭据。此外,您应该指定 False 以表明您不想要异步模式。

于 2011-02-15T08:55:59.353 回答
0

我将首先测试您是否可以通过您在 (A) 上运行代码的同一服务器 X 上的普通浏览器访问您的 url。然后我会尝试从另一台 PC 访问该 url。一个从未使用过该 URL,但与服务器 X (B) 在同一网络中。

如果 B 工作但 A 不工作,我会怀疑由于某种原因您的源服务器(即提供 url 的那个)由于某种原因阻止了服务器 X。检查 II6 和 NTLM 的安全设置。

如果 A 和 B 都不起作用,那么您的源服务器通常有一些问题(即它阻止了所有内容或 NTML 不允许您进入)。

如果 A 有效(那么 B 无关紧要),则问题必须在您的代码中的某个地方。在这种情况下,我会推荐fiddler。该工具可以实时为您提供浏览器和代码的 HTTP 请求。然后,您可以比较两者。这应该至少给你一个关于(如果不是立即给你)解决方案的非常强烈的提示。

于 2011-02-15T07:02:51.260 回答
0

听起来 OP 在注册表中使用正确的代理设置来解决这个问题(http://support.microsoft.com/kb/291008解释了为什么代理配置会解决这个问题)。较新版本的 ServerXMLHTTP 有一个 setProxy 方法,可用于在您的代码中设置必要的代理配置。

在上面的 OP 代码中,创建 webObj 后,以下代码行将正确设置代理:

webObj.setProxy 2, "0.0.0.0:80", "*.fpc.wa.gov.au" 

如果配置了代理,并且目标 URL 绕过该代理,ServerXMLHTTP 将传递运行代码的用户的凭据。由于无论如何您都在绕过代理,因此您可以将其设为 dummy value "0.0.0.0:80",并确保您的目标 url 被您在绕过列表中指定的内容所覆盖"*.fpc.wa.gov.au"

于 2014-11-21T14:45:37.780 回答