Powershell: invoking New-WebServiceProxy ruins following Invoke-WebRequest

The story so far: i'm writing a 'create-new-user' PoSh script, among all else i need it to:

  1. create WebServiceProxy object as variable (since Cisco UCM we use utilizes SOAP requests to interact with it)
  2. pull a PHP script on our Intranet website to sync it with Active Directory once the user is created, the easiest way is AFAIR Invoke-WebRequest commandlet.

So now it looks like this:

$ MyCreds = Get-Credential -Message "Укажите ваш пароль" -Username $($env: имя пользователя)
$AXL = New-WebServiceProxy -Uri $("\\server\smbshare\AXLAPI.wsdl") -Credential $MyCreds
.. Invoke-WebRequest -Uri "https://intranet.company.com/ad_sync.php" -Method Get

Я обнаружил, что вызов WebRequest перед созданием объекта WebServiceProxy успешен, однако вызов WebRequest в любое время после сбоя приводит к следующей ошибке:

Invoke-WebRequest: базовое соединение было закрыто: при отправке произошла непредвиденная ошибка.

У меня нет опыта работы с.NET, классами и подобными вещами, так что, возможно, я ошибаюсь в своих предположениях, но сейчас я пытаюсь (и не могу) выяснить, ожидается ли такое поведение? Базовая логика предполагает, что создание переменной не должно влиять на вызов простых запросов, но все же это влияет. Итак, я был бы благодарен за ссылку для чтения, которая объясняет, как это работает.

И еще один главный вопрос - есть ли решение или хотя бы обходной путь? Мои теоретические предложения напоминают удаление объекта WebServiceProxy (не знаю, как) или использование альтернативного способа извлечения сценария PHP.

Некоторая дополнительная информация:

  • Версия Powershell: 4.0
  • Часть WebServiceProxy предоставлена ​​коллегой, так что я не слишком знаком с ней, просто нужно собрать все в один скрипт
  • мы не можем изменить порядок команд из-за логики скрипта, это должно быть сделано именно в этом порядке

Любые советы по этому вопросу очень ценятся, спасибо!

1 ответ

Решение

Тем не мение New-WebServiceProxy гадости с Invoke-WebRequest это, вероятно, только в текущем процессе. Таким образом, обходной путь - запустить его из текущего процесса.

Так что меняй

Invoke-WebRequest -Uri "https://intranet.company.com/ad_sync.php" -Method Get

к

Start-Job -ScriptBlock { Invoke-WebRequest -Uri "https://intranet.company.com/ad_sync.php" -Method Get} | Receive-Job -Wait

Это запустит его в другом процессе и будет ждать результатов.

Другие вопросы по тегам