![]() |
|
WinHttp.WinHttpRequest.5.1 ntlm аутентификация на прокси сервере | ☑ | ||
---|---|---|---|---|
0
zzhiraf
19.10.11
✎
11:38
|
Не работает аутентификация на локальном прокси-сервере.
Код: ГетЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); ГетЗапрос.SetTimeouts(10000, 10000, 10000, 10000); //ЗапросУстановкиРегионаТМ ГетЗапрос.Open("GET", Сервер, false); // Синхронный режим. ГетЗапрос.setRequestHeader("Accept", "application/xml"); ГетЗапрос.setRequestHeader("Content-Type","application/xml; charset=Windows-1251"); ГетЗапрос.SetAutoLogonPolicy(0); ГетЗапрос.SetProxy(0);//!! настройки прокси должны браться из реестра... Попытка ГетЗапрос.Send();//здесь возникает исключение Исключение Возврат; КонецПопытки; СтатусОтправки = ГетЗапрос.status; Если СтатусОтправки = 407 Тогда //прокси требует авторизации ..... Настройки прокси в реестре устанавливаю таким образом: netsh winhttp import proxy source =ie (импортирую из ie) |
|||
1
Kreont
19.10.11
✎
11:42
|
(0) Подпишусь на тему :) Проверь будет ли на хп работать?
Заметил у себя подобную проблему что с WinHttp.WinHttpRequest.5.1 обработка перестала работать на win7, на хп работает. гуглил на тему: вроде проблема что на вин7 какой то там выше уровень аутентификации на прохи хочет (что-типа не плайн текстом а шифровать) и потому по дефалту не идет. |
|||
2
zzhiraf
19.10.11
✎
11:53
|
До аутентификации не доходит, похоже даже прокси сервер из реестра не считывается. Если задать прокси в явном виде, тогда уже возникают проблемы с аутентификацией...
|
|||
3
Kreont
19.10.11
✎
11:55
|
(2) А какая хоть ошибка, сделай сообщить в исключении?
|
|||
4
zzhiraf
19.10.11
✎
11:58
|
Ошибка такая:
ГетЗапрос.Send(); по причине: Произошла исключительная ситуация (WinHttp.WinHttpRequest): Время ожидания операции истекло |
|||
5
Kreont
19.10.11
✎
11:59
|
(0) Хотя под 8-ку обект "HTTPСоединение" должен аналогчино все обработать, (то в 7-ке глюки с ним были), сейчас сам на него переписываю.
|
|||
6
zzhiraf
19.10.11
✎
12:00
|
HTTPСоединение соединение все нормально отрабатывает, с ним другие проблемы :)
|
|||
7
Kreont
19.10.11
✎
12:02
|
(6) Код из (0) у меня отработал без ошибок (на вих ХП проф)
|
|||
8
Kreont
19.10.11
✎
12:04
|
(6) Какие другие? Интересно знать, а то теперь через него стараюсь писать...
|
|||
9
zzhiraf
19.10.11
✎
12:06
|
Ну, например, HTTPСоединение не может получить заголовки из ответа сервера. Заголовки можно только отправлять.
|
|||
10
zzhiraf
19.10.11
✎
12:06
|
А у тебя прокси-сервер используется?
|
|||
11
Kreont
19.10.11
✎
12:09
|
(10) Есть прокси, правда ответ смотрю: СтатусОтправки = 407 получил.
|
|||
12
zzhiraf
19.10.11
✎
12:11
|
Хм, получается, что у тебя хотя бы прокси определяется. У меня до авторизации не доходит даже :)
|
|||
13
Kreont
19.10.11
✎
12:11
|
+(11) в реестре прокси задан через proxycfg.exe, хз может от того что логин пароль все таки надо еще передать
|
|||
14
Kreont
19.10.11
✎
12:12
|
(12) Потестируй обработку на винХП, а не на 7-ке, может действительно проблема аналогичная до (1)
|
|||
15
zzhiraf
19.10.11
✎
12:13
|
В том то и дело что логин с паролем не хочется передавать, на то это и ntlm аутентификация)
proxycfg.exe это устаревшая утилита но она делает тоже самое по идее, что и netsh... |
|||
16
zzhiraf
19.10.11
✎
12:14
|
На винХП нет возможности пока проверить, везде семерка стоит
|
|||
17
zzhiraf
19.10.11
✎
12:16
|
Кстати, если кому интересно, в .net есть другой объект, с помощью которого удается пройти прокси сервер. Вот пример кода:
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(""Сервер""); myReq.Proxy = System.Net.WebRequest.GetSystemWebProxy(); myReq.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; WebResponse myWebResponse = myReq.GetResponse(); |
|||
18
Kreont
19.10.11
✎
12:24
|
Код из (0) у меня и на вин7-ке без ошибок отработал...
|
|||
19
zzhiraf
19.10.11
✎
12:29
|
Понятно... в чем же тогда может быть проблема у меня
|
|||
20
zzhiraf
19.10.11
✎
12:30
|
И СтатусОтправки 200?
|
|||
21
smaharbA
19.10.11
✎
12:31
|
мсдн - пережиток империализьма по всей видимости
|
|||
22
Kreont
19.10.11
✎
12:31
|
(20) 407, я потому и переписываю на HTTPСоединение только что б на вин7 заработало :)
|
|||
23
zzhiraf
19.10.11
✎
12:32
|
И что написано в мсдн ? :)
|
|||
24
zzhiraf
19.10.11
✎
12:33
|
Должен быть СтатусОтправки 200, значит у тебя тоже не работает авторизация...
|
|||
25
zzhiraf
19.10.11
✎
12:35
|
На самом деле из-за этого переписывать код на использование HTTPСоединение не правильно, т к этот объект очень ограничен. Как бы потом обратно не пришлось переписывать)
|
|||
26
smaharbA
19.10.11
✎
12:36
|
||||
27
Kreont
19.10.11
✎
12:36
|
(24) Автоматом из настроек реестра для WinHttp.WinHttpRequest.5.1 не работает, хотя через HTTPСоединение тестировал работает.
Сейчас логин и пароль внесены в модуль (некрасиво но работает) |
|||
28
zzhiraf
19.10.11
✎
12:39
|
smaharbA, спасибо, но это не особо помогает. У них в примере используется совсем другой объект, в котором можно задать схему авторизации и прочие настройки, которые просто не доступны для WinHttpRequest....
|
|||
29
smaharbA
19.10.11
✎
12:41
|
доступны
|
|||
30
zzhiraf
19.10.11
✎
12:42
|
Поспорим?)
|
|||
31
zzhiraf
19.10.11
✎
12:56
|
К примеру, для установки схемы авторизации используется метод WinHttpSetCredentials() http://msdn.microsoft.com/en-us/library/windows/desktop/aa384112(v=VS.85).aspx
Вместо этого метода у WinHttpRequest есть другой с ограниченным набором параметров SetCredentials() (задается только логин, пароль) |
|||
32
smaharbA
19.10.11
✎
13:26
|
точно прокси с нтлм-ом ?
|
|||
33
smaharbA
19.10.11
✎
13:26
|
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript"; РекордСет=СоздатьОбъект("ADODB.Recordset"); Объект.position=0; Скрипт.AddObject("Объект",Объект); Скрипт.AddObject("РекордСет",РекордСет); РекордСет.Fields.Append("txt", 200, Объект.Size, 128); РекордСет.Open(); РекордСет.AddNew(); Скрипт.Eval("РекордСет.Fields('txt').AppendChunk(Объект.Read)"); Стр=РекордСет.Fields("txt").Value; РекордСет.Close(); РекордСет=0; Возврат Стр; КонецФункции //******************************************* Процедура Сформировать() Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl"); Скрипт.language="javascript"; УРЛ="http://www.yandex.ru/"; ХТТПЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1"); Скрипт.AddObject("ХТТПЗапрос",ХТТПЗапрос); Скрипт.Eval("ХТТПЗапрос.Option(2)=1251"); ХТТПЗапрос.Open("GET", УРЛ, 0); ХТТПЗапрос.SetRequestHeader("Accept-Language", "ru"); ХТТПЗапрос.SetRequestHeader("Accept-Charset", "Windows-1251"); ХТТПЗапрос.SetRequestHeader("Content-Language", "ru"); ХТТПЗапрос.SetRequestHeader("Content-Charset", "Windows-1251"); ХТТПЗапрос.SetRequestHeader("Content-Encoding", "gzip, deflate"); ХТТПЗапрос.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=Windows-1251"); ХТТПЗапрос.SetRequestHeader("CACHE_CONTROL", "no-cache"); ХТТПЗапрос.SetRequestHeader("CONNECTION", "Keep-Alive"); ХТТПЗапрос.SetRequestHeader("USER_AGENT", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)"); ХТТПЗапрос.SetAutoLogonPolicy(0); ХТТПЗапрос.SetProxy(0); ХТТПЗапрос.Send(); к=_GetPerformanceCounter(); Пока ХТТПЗапрос.Status<>200 Цикл Если _GetPerformanceCounter()-к>=2000 Тогда Сообщить("Страница "+УРЛ+" неотвечает. Пипец!","!!!"); КонецЕсли; Состояние("Ждем..."); КонецЦикла; Стрим = СоздатьОбъект("ADODB.Stream"); Стрим.Mode = 3; Стрим.Type = 1; Стрим.Open(); Скрипт.AddObject("Стрим",Стрим); Скрипт.Eval("Стрим.Write(ХТТПЗапрос.responseBody)"); Стр=ПреобразованиеБинаровВТекст(Стрим); Предупреждение(Стр); |
|||
34
zzhiraf
19.10.11
✎
13:37
|
Да, прокси с ntlm...
У вас это работает? и я не очень понял, в чем отличие от того, что у меня написано? ... ХТТПЗапрос.Send(); по причине: Произошла исключительная ситуация (WinHttp.WinHttpRequest): Не удается установить соединение с сервером |
|||
35
Kreont
19.10.11
✎
13:42
|
Так может вся загвоздка в том что локальный прокси не работает вообще?
|
|||
36
zzhiraf
19.10.11
✎
13:44
|
У меня не работает? Как бы я тогда сидел в инете? к тому же HTTPСоединение работает с прокси без каких-либо дополнительных усилий...
|
|||
37
smaharbA
19.10.11
✎
14:02
|
(34) ни в чем, работает именно с нтлм авторизацией, иначе нужно задавать имя и пароль для прокси
|
|||
38
smaharbA
19.10.11
✎
14:03
|
и еще 0 авторизация на прокси и сервере, если авторизация рознится, нужно задать параметры авторизации для прокси и для сервера
|
|||
39
zzhiraf
19.10.11
✎
14:16
|
То есть вы проверили и у вас мой код работает (авторизация на прокси проходит)?
Параметры авторизации для какого сервера? на яндексе вроде нет авторизации никакой... По крайней мере у меня работает код из (17) и там я, как видно, никаких логинов паролей и адресов прокси явно не указываю |
|||
40
zzhiraf
19.10.11
✎
14:23
|
Кроме того у меня похоже вообще не определяется прокси-сервер автоматом, по крайней мере если его указать явно, то тогда Send() проходит...
|
|||
41
zzhiraf
19.10.11
✎
14:27
|
При этом адрес прокси указан в ветке реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\WinHttpSettings |
|||
42
zzhiraf
20.10.11
✎
11:44
|
Не могу понять, почему не применяются никакие настройки winhttp?
Настроил трассировку, но никаких логов не создается... netsh winhttp> set tracing trace-file-prefix="C:\tmp" level=verbose format=ansi Трассировка updated Текущие параметры трассировки WinHTTP. Трассировка enabled Префикс файла трассировки: C:\tmp Выход трассировки: file Уровень трассировки: verbose (headers, APIs, and entity body) Формат сетевого трафика: ansi Макс. размер файла трассировки (байт): 65535 |
|||
43
zzhiraf
20.10.11
✎
16:42
|
Ура! Прокси после долгих мучений определился автоматом. Вот в чем дело было:
It is important to note that when using proxycfg and netsh for configuration the default version you get from the command line is in the %SystemRoot%\System32 directory. This configures 64 bit WinHttp. To configure applications using the 32 bit WinHttp settings use the netsh and proxycfg bits from the %SystemRoot%\SysWOW64 directory instead. |
|||
44
zzhiraf
20.10.11
✎
16:43
|
Теперь надо с авторизацией разобраться)
|
|||
45
zzhiraf
20.10.11
✎
16:44
|
Есть какие-нибудь идеи?Или я тут сам с собой разговариваю?))
|
|||
46
zzhiraf
20.10.11
✎
16:51
|
В каком формате вообще нужно вручную задавать логин-пароль? Я пробовал с доменом и без, авторизация не проходит... ГетЗапрос.SetCredentials("домен\логин","пароль",1);
? |
|||
47
Kreont
20.10.11
✎
16:59
|
WinHttp.SetCredentials(ProxyLogin,ProxyPass,false);
|
|||
48
Kreont
20.10.11
✎
16:59
|
+(47) Перед этим:
WinHttp.SetProxy(2,ProxyAdressPort); |
|||
49
zzhiraf
20.10.11
✎
17:08
|
А почему false? это логин и пароль для сервера, для прокси true вроде как.
http://msdn.microsoft.com/en-us/library/aa384058(v=VS.85).aspx |
|||
50
Kreont
20.10.11
✎
17:18
|
(49) хз, у меня фалс работает :)))
А что так не идет? |
|||
51
zzhiraf
20.10.11
✎
17:29
|
Неа, не идет, СтатусОтправки 407 всегда получаю, хотя логин с паролем правильно указываю...
|
|||
52
zzhiraf
24.10.11
✎
11:39
|
Возможно, дело в настройках Windows. Попробуйте кто-нибудь, мне не помогло)
Запускаем редактор реестра (regedit). Находим ветку: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa. Внутри этой ветки нужно создать параметр LmCompatibilityLevel типа DWORD и присвоить ему значение 1 для использования LM NTLM и NTLMv2 авторизации. После этого необходимо перезагрузить компьютер. http://technet.microsoft.com/es-es/magazine/2006.08.securitywatch(en-us).aspx |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |