如何使用PowerShell下载受保护的文件?

Aar*_*ker 5 powershell teamcity ntlm powershell-3.0 teamcity-7.0

我试图从我的TeamCity构建服务器使用PowerShell 3.0下载文件.我已将TeamCity配置为使用NTLM身份验证,但我无法直接下载该文件并重定向到登录.

我试图使用以下PowerShell代码下载该文件.

$artifacts = "http://teamcity/repository/download/bt1/.lastSuccessful/%7Bbuild.number%7D.zip"
Invoke-WebRequest -Uri $artifacts -UseDefaultCredentials
Run Code Online (Sandbox Code Playgroud)

我对请求的响应是重定向到登录页面.

Aar*_*ker 12

这是最终解决方案的代码.


$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
Run Code Online (Sandbox Code Playgroud)

为了弄清楚发生了什么,我需要使用Fiddler来跟踪成功的请求是什么样的,并跟踪PowerShell中发生的事情.为了做到这一点,我不得不让我的PowerShell请求使用它.以下是我如何在PowerShell中启用Fiddler跟踪.

Invoke-WebRequest -Uri $artifacts -UseDefaultCredentials -Proxy http://localhost:8888/
Run Code Online (Sandbox Code Playgroud)

通过向命令添加-Proxy参数,它告诉他命令使用Fiddler作为代理服务器.

从这里我看到TeamCity正在将我重定向到登录页面.由于我打开了NTLM身份验证,因此您需要浏览一个特殊页面才能登录.所以我想从这里做的就是访问这个登录页面,然后使用我收到的cookie下载文件,因为TeamCity使用cookie来跟踪身份验证状态.

事实证明,Invoke-WebRequest cmdlet还允许您使用Web会话连接它们.有两种方法可以使用-WebSession-SessionVariable参数来完成此操作.经过一些反复试验后发现,如果使用-SessionVariable参数,它将在每次请求后覆盖会话变量,这样它就不会实际共享状态.显然,这不是我正在寻找的行为.相反,我不得不使用-WebSession参数,然后我可以将登录和文件下载链接在一起.一旦我这样做,一切都开始工作了.