[The English version of this post is available here]

Aqui estão alguns exemplos de como chamar Web Services clássicos no PowerShell. Eu fiz esses exemplos um tempo atrás e desde então eu os tenho compartilhado com vários colegas de trabalho através dos anos:

  1. Chamada de Web Service simples, utilizando as credenciais do usuário atual – default credential:
    # Cria o Proxy para o Web Service
    $ws = New-WebServiceProxy -Uri "http://spserver/_vti_bin/lists.asmx?wsdl" -UseDefaultCredential
    # Chama o web método
    $ws.GetListCollection()
    
  2. Chamada simples de Web Service, utilizando uma credencial específica:
    $credentials = New-Object System.Management.Automation.PSCredential("domain\myuser", (ConvertTo-SecureString -String "mypassword" -AsPlainText -Force));
    # Cria o Proxy para o Web Service
    $ws = New-WebServiceProxy -Uri "http://spserver/_vti_bin/lists.asmx?wsdl" -Credential $credentials;
    # Chama o web método
    $ws.GetListCollection();
    
  3. Chamando um Web Service num ambiente SharePoint configurado para Autenticação Baseada em Formulários (FBA):
    # Cria o Proxy para o Web Service de autenticação
    $wsAuth = New-WebServiceProxy -Uri "http://spserver/_vti_bin/authentication.asmx?wsdl" -UseDefaultCredential
    # Cria o Cookie Container para persistir os dados de autenticação retornados pelo método de autenticação
    $wsAuth.CookieContainer = new-object System.Net.CookieContainer;
    # Nesse momento, $wsAuth.CookieContainer.Count == 0
    $wsAuth.Login("myuser", "mypassword");
    # Nesse momento, $wsAuth.CookieContainer.Count == 1
    # Cria o Proxy para o Web Service
    $ws = New-WebServiceProxy -Uri "http://spserver/_vti_bin/lists.asmx?wsdl" -Credential $credentials;
    # Transfere o cookie container para o proxy do web service atual.
    $ws.CookieContainer = $wsAuth.CookieContainer;
    # Chama o web método
    $ws.GetListCollection();
    
  4. Chamando o mesmo Web Service “do jeito difícil”: montando a mensagem SOAP bruta e utilizando o objeto System.Net.HttpRequest para fazer a requisição:
    $soapMessageBytes = [System.Text.UTF8Encoding]::UTF8.GetBytes(@"
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Body>
    <GetListCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" />
    </soap12:Body>
    </soap12:Envelope>
    "@);
    $httpWebRequest = [System.Net.HttpWebRequest][System.Net.HttpWebRequest]::Create("http://spserver/_vti_bin/lists.asmx");
    $httpWebRequest.UseDefaultCredentials = $true;
    $httpWebRequest.Headers.Add("SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/GetListCollection");
    $httpWebRequest.ContentType = "text/xml;charset=`"utf-8`"";
    $httpWebRequest.ContentLength = $soapMessageBytes.Length;
    $httpWebRequest.Accept = "text/xml";
    $httpWebRequest.Method = "POST";
    $requestStream = $httpWebRequest.GetRequestStream();
    $requestStream.Write($soapMessageBytes, 0, $soapMessageBytes.Length);
    $requestStream.Flush();
    $response = $httpWebRequest.GetResponse();
    $resultStream = New-Object System.IO.StreamReader($response.GetResponseStream());
    $resultCall = $resultStream.ReadToEnd();
    $resultCall;