这是最终解决方案的代码。
$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 身份验证,因此您可以浏览一个特殊页面以登录。所以我想从这里做的是访问这个登录页面,然后使用我得到的 cookie 下载文件,因为 TeamCity 使用 cookie 来跟踪身份验证状态。
事实证明,Invoke-WebRequest cmdlet 还允许您使用 Web 会话连接它们。有两种方法可以使用-WebSession或-SessionVariable参数来完成此操作。经过反复试验,事实证明,如果您使用-SessionVariable参数,它将在每次请求后覆盖会话变量,因此它实际上并不共享状态。显然这不是我正在寻找的行为。相反,我必须使用-WebSession参数,然后我可以将登录和文件下载链接在一起。一旦我这样做了,一切就开始工作了。