我正在尝试使用 PowerShell 3.0 从我的 TeamCity 构建服务器下载文件。我已将 TeamCity 配置为使用 NTLM 身份验证,但无法直接下载文件并重定向到登录。
我正在尝试使用以下 PowerShell 代码下载文件。
$artifacts = "http://teamcity/repository/download/bt1/.lastSuccessful/%7Bbuild.number%7D.zip"
Invoke-WebRequest -Uri $artifacts -UseDefaultCredentials
我对请求的响应是重定向到登录页面。
最佳答案
这是的代码最终解决方案 .
$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 session 连接它们。有两种方法可以使用 -WebSession 或 -SessionVariable 参数来完成此操作。经过一些试验和错误,结果证明如果您使用 -SessionVariable 参数,它将在每次请求后覆盖 session 变量,因此它实际上不会共享状态。显然,这不是我正在寻找的行为。相反,我必须使用 -WebSession 参数,然后我可以将登录和文件下载链接在一起。一旦我这样做了,那么一切都开始工作了。
关于powershell - 如何使用 PowerShell 下载 protected 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14242139/