Ввод учетных данных в Invoke-WebRequest - PullRequest
1 голос
/ 27 сентября 2019
  • PowerShell 5.1.17763.592 / Windows Server 2019 версии 1809 (сборка 17763.737)

Я пытаюсь загрузить файл с помощью командлета Invoke-WebRequest.Файл защищен основной аутентификацией HTTP.Выполнение двухэтапного процесса работает следующим образом:

PS E:\> $cred = Get-Credential

cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
PS E:\> Invoke-WebRequest -Uri http://example.com/foo.zip -Credential $cred -OutFile $env:TEMP\foo.zip

Попытка передать учетные данные таким образом, чтобы я мог сделать это в одну строку, не удалась:

PS E:\> Get-Credential | Invoke-WebRequest -Uri http://example.com/foo.zip -Credential $_ -OutFile $env:TEMP\foo.zip

cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
Invoke-WebRequest : Cannot send a content-body with this verb-type.
At line:1 char:18
+ ... redential | Invoke-WebRequest -Uri http://example.com/foo.z ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [Invoke-WebRequest], ProtocolViolationException
+ FullyQualifiedErrorId : System.Net.ProtocolViolationException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Я гуглилошибка, но единственное, что я могу найти, это Invoke-WebRequest, использующий метод Get, не допускает content-body , но если это основная причина, я не понимаю, почему двухлинейная работа сработает.Я подозреваю, что неправильно понял, как оценивается $_.

1 Ответ

0 голосов
/ 30 сентября 2019

Вы можете подделать «одну строку» с точкой с запятой, используемой для разделения операторов, например:

$cred = Get-Credential ; Invoke-WebRequest -Credential $cred -Uri http://example.com/foo.zip -OutFile $env:TEMP\foo.zip

Если безопасность не является проблемой, вы можете создать учетные данные без запросов:

$User = "whatever"
$Pass = ConvertTo-SecureString -String "plaintextpassword" -Force -AsPlainText
$Cred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User, $Pass
Invoke-WebRequest -Credential $Cred -Uri http://example.com/foo.zip -OutFile $env:TEMP\foo.zip

Как уже отмечалось, комментарий JosefZ также работает и включает причину, по которой вы не можете просто передать Get-Credential объект в Invoke-Webrequest сам по себе:

$ _ являетсяОднако объект конвейера -Credential не принимает входные данные конвейера.Используйте, например,

Get-Credential | ForEach-Object {Invoke-WebRequest -Credential $_ -Uri …}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...