如何通过身份验证从网络服务器下载文件夹?

How can I download a folder from a webserver with authentication?

我需要一个脚本,用于将某个文件夹及其所有子文件夹和文件从网络服务器下载到我的电脑。它需要在 powershell 中。我搜索了一下,发现了这个:

Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip

当我尝试 运行 时出现此错误。但我不知道如何用它传递用户名和密码。如果有人可以帮助我,将不胜感激!另外我如何指定它应该保存到的文件夹?提前致谢

$cred = Get-Credential
Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip -Credential $cred

正在跟进我的评论。

我问这个问题是因为有些网站要求您在凭证展示中具体说明,而不是只提供一团东西。例如:

$credentials = Get-Credential

$webServerUrl               = 'http://SomeWebSite'
$r                          = Invoke-WebRequest $webServerUrl -SessionVariable my_session
$form                       = $r.Forms[0]
$form.fields['Username']    = $credentials.GetNetworkCredential().UserName
$form.fields['Password']    = $credentials.GetNetworkCredential().Password

$InvokeWebRequestSplat = @{
    Uri        = $($webServerUrl + $form.Action) 
    WebSession = $my_session 
    Method     = 'GET '
    Body       = $form.Fields
}
$r = Invoke-WebRequest @InvokeWebRequestSplat

更新

follow-up给评论。这是将 IE 与 PowerShell 一起用于网站自动化。

# Scrape the site to find form data
$url = 'https://pwpush.com'
($FormElements = Invoke-WebRequest -Uri $url -SessionVariable fe)  
($Form = $FormElements.Forms[0]) | Format-List -Force
$Form | Get-Member
$Form.Fields

# Use the info on the site
$IE = New-Object -ComObject "InternetExplorer.Application"

$FormElementsequestURI = "https://pwpush.com"
$Password = "password_payload"
$SubmitButton = "submit"

$IE.Visible = $true
$IE.Silent = $true
$IE.Navigate($FormElementsequestURI)
While ($IE.Busy) {
    Start-Sleep -Milliseconds 100
}

$Doc = $IE.Document
$Doc.getElementsByTagName("input") | ForEach-Object {
    if ($_.id -ne $null){
        if ($_.id.contains($SubmitButton)) {$SubmitButton = $_}
        if ($_.id.contains($Password)) {$Password = $_}
    }
}

$Password.value = "1234"
$SubmitButton.click()

Invoke-WebRequest 是 Powershell 的 curl 版本。它的别名甚至被命名为 curl。

所以,在 IVR 用例中,您真正需要做的就是 Facebook 和 Linkedin 示例:

$cred  = Get-Credential
$login = Invoke-WebRequest 'facebook.com/login.php' -SessionVariable 'fb'
$login.Forms[0].Fields.email = $cred.UserName
$login.Forms[0].Fields.pass = $cred.GetNetworkCredential().Password
$mainPage = Invoke-WebRequest $login.Forms[0].Action -WebSession $fb -Body $login -Method Post 

$cred = Get-Credential
$login = Invoke-WebRequest 'https://www.linkedin.com/uas/login?goback=&trk=hb_signin' -SessionVariable 'li'
$login.Forms[0].Fields.email = $cred.UserName
$login.Forms[0].Fields.pass = $cred.GetNetworkCredential().Password
$mainPage = Invoke-WebRequest $login.Forms[0].Action -WebSession $LI -Body $login -Method Post 

但是,请注意我在 FB/LI 登录页面上,在尝试之前我需要知道它是否存在。请注意,这是旧代码,我已经很长时间没有使用了,而且我没有 FB 帐户。我把它转给了一个这样做的人。