【问题标题】:401 Unauthorised errors when attempting to download ASP page to file尝试将 ASP 页面下载到文件时出现 401 未经授权的错误
【发布时间】:2011-02-15 05:48:08
【问题描述】:

问题

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

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

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

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

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

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

需要解决方案

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

说明

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

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

但是,由于组织还不够聪明,无法在每个站点投资 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

【问题讨论】:

  • 您是说“源服务器正在运行 IIS6,使用 NTLM 集成登录”。这并不意味着 ServerXMLHTTP 会自动从您的请求发出的服务器应用“正确的凭据”。

标签: asp-classic vbscript msxml serverxmlhttp


【解决方案1】:

更换你的线路:

webObj.Open "GET", strURL 

与:

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

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

【讨论】:

  • 我应该提到我之前尝试过这种方法并返回相同的错误。但是,用于在注册表中正确配置代理配置的 MS KB 链接(请参阅有关问题的 cmets)已经完成了使其进行身份验证的技巧。我没有在配置字符串中传递一些开关来让它玩得很好。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    听起来 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" 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2014-06-25
      • 2021-05-28
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      相关资源
      最近更新 更多