Имя: Пароль:
1C
1С v8
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