これが最終的な解決策のコードです。
$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リクエストでそれを使用する必要がありました。以下は、PowerShell内からFiddlerトレースをオンにした方法です。
Invoke-WebRequest -Uri $artifacts -UseDefaultCredentials -Proxy http://localhost:8888/
コマンドに-Proxy引数を追加することにより、Fiddlerをプロキシサーバーとして使用するようにコマンドに指示しました。
ここから、TeamCityがログインページにリダイレクトしているのがわかりました。NTLM認証をオンにしているので、ログインするために参照する特別なページがあります。そこで、ここからやりたかったのは、このログインページにアクセスし、TeamCityがCookieを使用して認証ステータスを追跡するときに取得したCookieを使用してファイルをダウンロードすることでした。
また、Invoke-WebRequestコマンドレットを使用すると、Webセッションを使用してそれらを接続することもできます。-WebSessionまたは-SessionVariableパラメーターを使用してこれを実現する方法は2つあります。試行錯誤の末、-SessionVariableパラメーターを使用すると、各リクエストの後にセッション変数が上書きされるため、実際には状態が共有されないことがわかりました。明らかに、これは私が探している動作ではありません。代わりに、-WebSessionパラメーターを使用する必要があり、ログインとファイルのダウンロードを連鎖させることができました。これを行うと、すべてが機能し始めました。