401 Несанкционированные ошибки при попытке загрузить страницу ASP в файл

вопрос

Msxml2.ServerXMLHTTP продолжает возвращать 401 - неавторизованные ошибки каждый раз, когда мы пытаемся прочитать содержимое файла (ASP) с веб-сервера.

Исходный сервер работает под управлением IIS6, используя встроенный логин NTLM.

Этот процесс успешно использовался ранее, но только для извлечения файлов XML с внешних веб-сайтов, а не внутренних.

Параметры прокси-сервера в реестре сервера, на котором выполняется скрипт, также были обновлены для обхода данного веб-сайта, но безрезультатно.

Все пути, идентифицированные в VBScript, были проверены и протестированы и являются правильными.

Пользователь, выполняющий сценарий, имеет правильные разрешения на чтение / запись для всех расположений, указанных в сценарии.

Требуется решение

Определить причину несанкционированных сообщений HTTP 401, чтобы скрипт работал как положено.

Описание

Наша организация использует интрасеть, где контент реплицируется на серверы на каждом из наших удаленных сайтов. Это гарантирует, что эти сайты продолжают быстрый доступ к важной информации, документации и данным даже в случае потери связи.

Мы находимся в процессе совершенствования списка и управления формами (это надоедливые бумажки, которые нужно заполнять для конкретных задач). Это включает создание базы данных всех наших форм.

Однако, поскольку организация недостаточно умна, чтобы вкладывать средства в экземпляры MSSQL Server на каждом сайте, репликация базы данных и доступ к ней с локального сервера SQL невозможны.

Чтобы обойти это, я построил серию представлений (ASP-страниц), которые отображают необходимые данные. Затем я намереваюсь использовать Msxml2.ServerXMLHTTP от VBScript, чтобы я мог прочитать полученные страницы и сохранить выходные данные в статический файл на сервере.

Оттуда, существующий процесс репликации может передавать эти файлы на сайт - пользователи не подозревают, что они смотрят на статическую страницу, которая, как оказалось, была сгенерирована из выходных данных базы данных.

Код

' 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

3 ответа

Решение

Замените свою строку:

webObj.Open "GET", strURL 

С:

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

В большинстве случаев 401 Unauthorized означает, что вы не предоставили учетные данные. Также вы должны указать False, чтобы указать, что вы не хотите асинхронный режим.

Похоже, что 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"

Сначала я проверил бы, можете ли вы получить свой URL через обычный браузер на том же сервере X, на котором вы запускаете свой код (A). Я хотел бы попытаться получить URL с другого компьютера. Никто не использовал для достижения этого URL, но в той же сети, что и сервер X (B).

Если B работает, но A нет, я бы заподозрил, что по какой-то причине ваш исходный сервер (то есть тот, который обслуживает URL) блокирует сервер X по какой-то причине. Проверьте настройки безопасности II6 и NTLM.

Если и A, и B не работают, то с вашим исходным сервером в целом что-то не так (т.е. он блокирует все или NTML не позволяет вам войти).

Если A работает (B не имеет значения), проблема должна быть где-то в вашем коде. В этом случае я бы порекомендовал скрипач. Этот инструмент может предоставить вам HTTP-запросы вашего браузера и вашего кода в режиме реального времени. Затем вы можете сравнить оба. Это должно дать вам по крайней мере очень сильный намек на (если не сразу дать вам) решение.

Другие вопросы по тегам