0

問題

Msxml2.ServerXMLHTTPは401を返し続けます-Webサーバーからファイル(ASP)の内容を読み取ろうとするたびに、許可されていないエラーが発生します。

ソースサーバーは、NTLM統合ログインを使用してIIS6を実行しています。

このプロセスは以前は正常に使用されていましたが、内部Webサイトではなく外部WebサイトからXMLファイルを抽出する場合に限ります。

スクリプトが実行されるサーバーのレジストリのプロキシ設定も更新され、問題のWebサイトをバイパスしますが、役に立ちません。

VBScriptで識別されたすべてのパスがチェックおよびテストされており、正しいものです。

スクリプトを実行しているユーザーには、スクリプトで参照されているすべての場所に対する正しい読み取り/書き込み権限があります。

必要な解決策

スクリプトが意図したとおりに機能するように、HTTP401未承認メッセージの原因を特定します。

説明

私たちの組織はイントラネットを運営しており、コンテンツは各リモートサイトのサーバーに複製されます。これにより、接続が失われた場合でも、これらのサイトが重要な情報、ドキュメント、およびデータに高速にアクセスし続けることができます。

フォーム(特定のタスクのために記入する必要のある厄介な紙片)のリストと管理を改善している最中です。これには、すべてのフォームのデータベースを確立することが含まれます。

ただし、組織は各サイトのMSSQL Serverインスタンスに投資するほど賢くはないため、データベースを複製してローカルSQLServerからデータベースにアクセスすることはできません。

これを回避するために、必要なデータを表示する一連のビュー(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

最初に、コードを実行しているのと同じサーバーXの通常のブラウザーからURLに到達できるかどうかをテストします(A)。次に、別のPCからURLにアクセスしてみます。そのURLに到達するために使用されたことはありませんが、サーバーX(B)と同じネットワーク内にあります。

Bは機能するが、Aは機能しない場合、何らかの理由でソースサーバー(つまり、URLを提供するサーバー)が何らかの理由でサーバーXをブロックしていると思われます。II6およびNTLMのセキュリティ設定を確認してください。

AとBの両方が機能しない場合は、ソースサーバーに一般的な問題があります(つまり、すべてをブロックするか、NTMLで許可されません)。

Aが機能する場合(Bは関係ありません)、問題はコードのどこかにある必要があります。その場合は、フィドラーをお勧めします。このツールを使用すると、ブラウザとコードの両方の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" 

ServerXMLHTTPは、コードがプロキシで構成されている場合、およびターゲットURLがそのプロキシをバイパスする場合、コードを実行しているユーザーの資格情報を渡します。とにかくプロキシをバイパスしているので、それをダミー値"0.0.0.0:80"にすることができ、ターゲットURLがバイパスリストで指定したものでカバーされていることを確認してください"*.fpc.wa.gov.au"

于 2014-11-21T14:45:37.780 に答える