Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумНастройка и подключение

Windows: setx, netsh winhttp и почему они не одно и то же

kvadrat_ru
kvadrat_ru
Участник
сообщений 855
с июл
22 августа, 17:07первое сообщение

Настраивал винду под сбор и запутался в трёх местах, где вроде бы задаётся одно и то же.

Прописал netsh winhttp set proxy, проверил, показывает верно. Питоновский скрипт при этом ходит напрямую. Прописал setx HTTP_PROXY, в открытой консоли пусто, открыл новую, там появилось. Служба, которая крутит прогон, не видит ни того, ни другого.

Разложите, пожалуйста, по полочкам, кто из них на что влияет.

Михаил Дроботов
Михаил Дроботов
Участник
сообщений 615
с сен
1 января, 08:24#2

Полочек тут три, и они действительно разные.

Первая, WinHTTP. Настройка задаётся через netsh winhttp set proxy и лежит в системе. Ей пользуются службы и часть системных компонентов: обновление, некоторые агенты, приложения на .NET, если их специально не научили другому. Проверяется командой netsh winhttp show proxy.

Вторая, WinINET. Это то, что открывается в свойствах браузера и живёт в ветке пользователя. Туда смотрят браузеры на движке системы и старые программы. К первой полочке отношения не имеет совсем, хотя настройки можно перелить одной командой:

netsh winhttp import proxy source=ie

Третья, переменные окружения. Их читают программы, пришедшие из мира юникса: curl, python, git, node. Ни первую, ни вторую полочку они не смотрят. Отсюда ваш скрипт и ходит напрямую.

Кто настраиваетКто читает
netsh winhttpслужбы, обновление, часть .NET
свойства браузерабраузеры на системном движке
HTTP_PROXY и соседиcurl, python, git, node
десять лет в поддержке, всё видел
kvadrat_ru
kvadrat_ru
Участник
сообщений 855
с июл
8 июня, 11:41#3
Михаил Дроботов: их читают программы, пришедшие из мира юникса

То есть для питона netsh вообще бесполезен, сколько его ни настраивай?

И второй вопрос: почему setx не виден в той консоли, где я его набрал?

Михаил Дроботов
Михаил Дроботов
Участник
сообщений 615
с сен
15 ноября, 14:58#4

Для питона бесполезен, да. Он смотрит только переменные.

Про консоль: setx пишет значение в реестр и рассылает уведомление о смене окружения. Уже запущенные процессы своё окружение не перечитывают, оно скопировано им при старте. Поэтому текущая консоль остаётся со старым набором, а любая новая получает свежий. Если нужно прямо здесь и сейчас, добавьте обычный set, он живёт до закрытия окна:

set HTTP_PROXY=http://login:pass@193.0.2.44:8000
setx HTTP_PROXY http://login:pass@193.0.2.44:8000
десять лет в поддержке, всё видел
tabless
tabless
Участник
сообщений 800
с июл
22 апреля, 17:15#5

Про службу отвечу, раз никто не начал. Служба крутится под своей учётной записью, чаще всего это системная. Пользовательские переменные, которые кладёт обычный setx, ей недоступны, у неё своя ветка реестра.

Надо писать в машинные, ключ с большой буквы:

setx /M HTTP_PROXY http://login:pass@193.0.2.44:8000
setx /M HTTPS_PROXY http://login:pass@193.0.2.44:8000
setx /M NO_PROXY localhost,127.0.0.1,.local

Консоль при этом должна быть от администратора, иначе выйдет отказ. И службу после правки надо перезапустить, на лету она новое окружение не подхватит.

mila_ops
mila_ops
Новичок
сообщений 175
с апр, второй сезон
1 сентября, 08:32#6

подскажите, а как посмотреть что реально видит служба? в реестре одно, а работает будто другое

hardline
hardline
Знаток
сообщений 970
с июн
8 февраля, 11:49#7

Смотреть надо у живого процесса, реестр показывает намерение. Из повершелла:

Get-Process -Name python | ForEach-Object {
    (Get-CimInstance Win32_Process -Filter "ProcessId=$($_.Id)").CommandLine
}
[Environment]::GetEnvironmentVariable('HTTP_PROXY','Machine')
[Environment]::GetEnvironmentVariable('HTTP_PROXY','User')

Две последние строки показывают именно машинное и пользовательское значения по отдельности, и сразу видно, какое из них вы правили. А окружение конкретного процесса удобно смотреть через Process Explorer, вкладка Environment.

kvadrat_ru
kvadrat_ru
Участник
сообщений 855
с июл
15 июля, 14:06#8

Разложилось. По итогу у меня было так: скрипт руками работал, потому что переменная лежала в пользовательской ветке, а служба шла мимо, потому что смотрела в машинную и там было пусто.

Переписал через setx /M, перезапустил службу, прогон пошёл через посредника. netsh winhttp оставил настроенным, он нужен для обновления, но к прогону отношения не имеет.