Pull to refresh

Comments 14

Спасибо! Хочется верить, что не бесполезный, да :)

Планирую переложить скрипты на гитхаб, т.к. уже нашёл несколько мелких, но неприятных косяков и исправил проверку версии, а править пост по 10 раз не хочется…
Обновления:
  1. Переместил скрипты на гитхаб, чтобы не редактировать тут пост при обновлениях кода.
  2. Обновил описание к скриптам (в частности, набор параметров).


Если кто-то успел забрать старые скрипты — лучше взять новые с гитхаба. Они стали умнее :)
Обратите внимание: в старом скрипте для скачивания обновлений требовалось указать в параметре '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
Во-первых, я ярый противник передачи пароля в открытом виде, а тем более, хранения его в скрипте.
Уж если брать пароль открытым текстом, то хотя бы так:
$cred = Get-Credential $ProxyCreds
$UserName = $cred.UserName
$Password = $cred.GetNetworkCredential().Password

Во-вторых, мне кажется, у вас как-то неправильно настроен сквид, если он не принимает на входе ProxyCredential. Посмотреть бы на лог WireShark — где и почему он отфутболивает.

Я положил свой скрипт в шедулер на сервер выполняться от моей доменной учётки с ключом «ProxyUseDefaultCredentials» — используются учётные данные записи, от которой запускается скрипт (в моём скрипте достаточно опустить параметр ProxyCreds для использования этого ключа автоматически). На прокси настроена доменная авторизация.
Согласен с вами по поводу пароля. «Расчехлил» tcpdump, попробывал еще 3proxy с 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
image

Тест 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
image

На этом варианте похоже я и остановлюсь.
В первом случае не заработало ожидаемо — $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
Значит, так правильнее.
В вашем случае — видимо, да.

Я проверял скрипт на WebSense и BlueCoat. На обоих работают оба варианта: и ProxyCredential, и ProxyUseDefaultCredentials.
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.
В любом случае — респект за статью. Это мой уже третий заход в этом направлении, на SSL в документации вообще не обратил внимания, а directory listing — таки да, нужен (ух, какой же изврат с его включением в server 2012… — кто будет там поднимать (удобно, например, на одном хосте со wsus) — обратите внимание, что включать его надо через roles and features).
Sign up to leave a comment.

Articles