Comments 14
Добро пожаловать, полезный член сообщества :)
Обновления:
Если кто-то успел забрать старые скрипты — лучше взять новые с гитхаба. Они стали умнее :)
Обратите внимание: в старом скрипте для скачивания обновлений требовалось указать в параметре 'FPRoot' путь к папке 'sau', в новой версии — к корневой папке сервера обновлений. Скрипт теперь создаёт требуемую структуру директорий сам, если её нет.
- Переместил скрипты на гитхаб, чтобы не редактировать тут пост при обновлениях кода.
- Обновил описание к скриптам (в частности, набор параметров).
Если кто-то успел забрать старые скрипты — лучше взять новые с гитхаба. Они стали умнее :)
Обратите внимание: в старом скрипте для скачивания обновлений требовалось указать в параметре 'FPRoot' путь к папке 'sau', в новой версии — к корневой папке сервера обновлений. Скрипт теперь создаёт требуемую структуру директорий сам, если её нет.
А как заставить Invoke-WebRequest работать через squid
Пробывал:
Не пускает прокси.
Пробывал:
#$cred = Get-Credential $ProxyCreds
$SecPass = ConvertTo-Securestring $ProxyPass -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ProxyUser, $SecPass
$WebrequestParams['ProxyCredential']=$cred
Не пускает прокси.
Getting ADOBE server version (ESR)...FAIL!
Can't verify ADOBE server version! Error: [The remote server returned an error:
(407) Proxy Authentication Required.].
Сам отвечу на свой же вопрос. Получилось только так
$ProxyUser = "user"
$ProxyPass = "pass"
$Proxy = "http://xxx.xxx.xxx.xxx:xxxx"
$url = 'http://www.adobe.com/ru/products/flashplayer/distribution3.html'
#Auth
$pair = "$($ProxyUser):$($ProxyPass)"
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
#Proxy
$prox = new-object net.WebProxy;
$prox.Address = $Proxy
# Request
$req = [net.webRequest]::Create($url)
$req.method = "GET"
$req.Host = "www.adobe.com"
$req.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:42.0) Gecko/20100101 Firefox/42.0"
$req.Proxy = $prox
$req.Headers['Proxy-Authorization'] = "Basic $encodedCreds";
#Responce
$resp = $req.GetResponse()
$stream = new-object io.streamreader $resp.GetResponseStream()
$res = $stream.readtoend()
$res
Во-первых, я ярый противник передачи пароля в открытом виде, а тем более, хранения его в скрипте.
Уж если брать пароль открытым текстом, то хотя бы так:
Во-вторых, мне кажется, у вас как-то неправильно настроен сквид, если он не принимает на входе ProxyCredential. Посмотреть бы на лог WireShark — где и почему он отфутболивает.
Я положил свой скрипт в шедулер на сервер выполняться от моей доменной учётки с ключом «ProxyUseDefaultCredentials» — используются учётные данные записи, от которой запускается скрипт (в моём скрипте достаточно опустить параметр ProxyCreds для использования этого ключа автоматически). На прокси настроена доменная авторизация.
Уж если брать пароль открытым текстом, то хотя бы так:
$cred = Get-Credential $ProxyCreds
$UserName = $cred.UserName
$Password = $cred.GetNetworkCredential().Password
Во-вторых, мне кажется, у вас как-то неправильно настроен сквид, если он не принимает на входе ProxyCredential. Посмотреть бы на лог WireShark — где и почему он отфутболивает.
Я положил свой скрипт в шедулер на сервер выполняться от моей доменной учётки с ключом «ProxyUseDefaultCredentials» — используются учётные данные записи, от которой запускается скрипт (в моём скрипте достаточно опустить параметр ProxyCreds для использования этого ключа автоматически). На прокси настроена доменная авторизация.
Согласен с вами по поводу пароля. «Расчехлил» tcpdump, попробывал еще 3proxy с basic авторизацией.
Провел 2 теста с 3proxy и squid.
Тест 1.
3proxy и squid ругнулись — 407, в HTTP заголовке отсутсвует Proxy-Authorization
Тест 2.
Ура! Заработало. В HTTP заголовке уже появился Proxy-Authorization и basic авторизация прошла.
На этом варианте похоже я и остановлюсь.
Провел 2 теста с 3proxy и squid.
Тест 1.
$Proxy = "http://xxx.xxx.xxx.xxx:xxxx"
$ProxyCreds = "user"
$cred = Get-Credential $ProxyCreds
$UserName = $cred.UserName
$Password = $cred.GetNetworkCredential().Password
try {
Invoke-WebRequest -Uri "http://ya.ru" -Proxy $Proxy -ProxyUseDefaultCredentials
} catch {
Write-Host -f Red "Error: [$($_.Exception.Message)]."
break
}
3proxy и squid ругнулись — 407, в HTTP заголовке отсутсвует Proxy-Authorization
HTTP заголовок в wireshark

Тест 2.
$Proxy = "http://xxx.xxx.xxx.xxx:xxxx"
$ProxyCreds = "user"
$cred = Get-Credential $ProxyCreds
$UserName = $cred.UserName
$Password = $cred.GetNetworkCredential().Password
$pair = "$($UserName):$($Password)"
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
$Headers = @{
'Proxy-Authorization' = "Basic $encodedCreds"
}
try {
Invoke-WebRequest -Uri "http://ya.ru" -Proxy $Proxy -ProxyUseDefaultCredentials -Headers $Headers
} catch {
Write-Host -f Red "Error: [$($_.Exception.Message)]."
break
}
Ура! Заработало. В HTTP заголовке уже появился Proxy-Authorization и basic авторизация прошла.
HTTP заголовок в wireshark

На этом варианте похоже я и остановлюсь.
В первом случае не заработало ожидаемо —
Ещё раз, флаг
Можно добавить в скрипт ещё один флаг (о да, я люблю тысячи параметров запуска для скриптов!) наподобие
$creds
просто не используется, т.е. вы действительно не передаёте данные для авторизации :-)Ещё раз, флаг
-ProxyUseDefaultCredentials
использует для авторизации на прокси УЗ, от имени которой выполняется скрипт. Если сквозная авторизация на прокси не настроена — этот флаг для вас бесполезен — только явная передача данных для авторизации. Соответственно, нужно передавать авторизацию либо через -ProxyCredential
, либо как-то по-другому, если прокси не принимает авторизацию от PowerShell стандартным способом. Ваш вариант — тоже вполне себе вариант.Можно добавить в скрипт ещё один флаг (о да, я люблю тысячи параметров запуска для скриптов!) наподобие
ProxyBasicAuth
, и добавить для него вариант отправки авторизации в Basic формате.Ок. Понял, причесал код. В заголовке пусто. Странно конечно, может он по NTML пытается авторизоваться.
Значит, так правильнее.
try {
Invoke-WebRequest -Uri "http://ya.ru" -Proxy "http://xx.xx.xx.xxx:xxxx" -ProxyCredential(Get-Credential)
} catch {
Write-Host -f Red "Error: [$($_.Exception.Message)]."
break
}
Значит, так правильнее.
Invoke-WebRequest -Uri "http://ya.ru" -Proxy $Proxy -Headers $Headers
Adobe отказывается от Extended Support Release. Обратите внимание на UPD2.
Буквально на днях сделал у нас в конторе такое, автовыкачивание пока не делал, но файл с контентом пока прекрасно выкачивается по ссылке https://fpdownload.macromedia.com/pub/flashplayer/current/licensing/win/fp_background_update.cab
Да, но в этом файле нет апдейта, например, с 15-й версии. Скрипт автовыкачивания качает всё, что доступно с версии 11 по актуальную (сейчас это 11,15...23). Правда, в текущей версии моего скрипта не учтён FP для PPAPI (Chrome и подобные).
Кроме того, я пересадил сервер на Ubuntu Server, в связи с чем состряпал скрипт автовыкачивания на bash с отправкой уведомления по e-mail. Как будет время, обновлю скрипт на PowerShell для выкачивания PPAPI и выложу дополнительно скрипт на bash.
Кроме того, я пересадил сервер на Ubuntu Server, в связи с чем состряпал скрипт автовыкачивания на bash с отправкой уведомления по e-mail. Как будет время, обновлю скрипт на PowerShell для выкачивания PPAPI и выложу дополнительно скрипт на bash.
В любом случае — респект за статью. Это мой уже третий заход в этом направлении, на SSL в документации вообще не обратил внимания, а directory listing — таки да, нужен (ух, какой же изврат с его включением в server 2012… — кто будет там поднимать (удобно, например, на одном хосте со wsus) — обратите внимание, что включать его надо через roles and features).
Sign up to leave a comment.
Внутренний сервер обновления Adobe Flash Player