Вот код для окончательного решения.
$artifacts = "http://teamcity/repository/download/bt1/.lastSuccessful/%7Bbuild.number%7D.zip"
$login = "http://teamcity/ntlmLogin.html"
$dest = "Artifacts.zip"
$TeamCitySession = New-Object Microsoft.PowerShell.Commands.WebRequestSession
Invoke-WebRequest -Uri $login -WebSession $TeamCitySession -UseDefaultCredentials -UseBasicParsing
Invoke-WebRequest -Uri $artifacts -WebSession $TeamCitySession -UseBasicParsing -OutFile $dest
Чтобы понять, что происходит, мне нужно было использовать Fiddler, чтобы отследить, как выглядит успешный запрос, а также отследить, что происходит в PowerShell. Для этого мне пришлось заставить мой запрос PowerShell использовать его. Ниже показано, как я включил трассировку Fiddler из PowerShell.
Invoke-WebRequest -Uri $artifacts -UseDefaultCredentials -Proxy http://localhost:8888/
Добавив к команде аргумент -Proxy, он указал команде использовать Fiddler в качестве прокси-сервера.
Отсюда я увидел, что TeamCity перенаправляет меня на страницу входа. Поскольку у меня включена аутентификация NTLM, есть специальная страница, на которую вы переходите, чтобы войти в систему. Итак, что я хотел сделать отсюда, так это посетить эту страницу входа, а затем загрузить файл с использованием файлов cookie, которые я получаю, поскольку TeamCity использует файл cookie для отслеживания статуса аутентификации.
Также оказывается, что командлеты Invoke-WebRequest также позволяют подключать их с помощью веб-сеанса. Это можно сделать двумя способами: с помощью параметра -WebSession или параметра -SessionVariable. После некоторых проб и ошибок выясняется, что если вы используете параметр -SessionVariable, он будет перезаписывать переменную сеанса после каждого запроса, так что на самом деле он не будет делиться состоянием. Ясно, что это не то поведение, которое я ищу. Вместо этого мне пришлось использовать параметр -WebSession, после чего я мог объединить вход в систему и загрузку файла. Как только я это сделал, все начало работать.
person
Aaron Weiker
schedule
09.01.2013