Interagindo com Web Services clássicos (asmx) no PowerShell
[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:
- Chamada de Web Service simples, utilizando as credenciais do usuário atual – default credential:
[code language=”PowerShell”] # 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()
[/code] - Chamada simples de Web Service, utilizando uma credencial específica:
[code language=”PowerShell”] $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();
[/code] - Chamando um Web Service num ambiente SharePoint configurado para Autenticação Baseada em Formulários (FBA):
[code language=”PowerShell”] # 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();
[/code] - 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:
[code language=”PowerShell”] $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;
[/code]