So einfach geht Salesforce REST mit Powershell

Es muss ja nicht immer curl sein. //

Salesforce Setup

  • Eine konfigurierte connected App (Unter Apps => Create)
    • Relaxed IP Restrictions
    • All User may self authorize
    • aktivierte myDomain
    • full OAUTH Scope (nur zum privaten Test, wenn das klappt, weiter einschränken)
    • Client ID und Client Secret der connected App
    • Username, Paßwort und Security Token

Powershell Script

Mittels weniger Zeilen hole ich eine strukturierte Liste meiner zu letzt verwendenten Salesforce Objekte vom Recent Endpoint ab.

$instance = "https://sz-dev-ed.my.salesforce.com"
$services = Invoke-RestMethod -uri ($instance+"/services/data/v39.0") -Headers (getHeaders $instance)
Invoke-RestMethod -uri ($instance+$services.recent) -Headers (getHeaders $instance)

Das bißchen magic sauce besteht aus der kleinen Funktion getHeaders, in der alles nötige eingetragen und TLS 1.2 festgeschrieben ist. Für den persönlichen Gebrauch habe ich verschiedene Environment Variabeln angelegt, damit die Funktion wiederverwendbar ist. Zur Laufzeit geht das mit $env:TestVariable = "This is a test environment variable."


function getHeaders(){
    # set tls properly by configuring .NET framework
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    # use mydomain url
    $instance = $args[0]
    $uri = $instance+"/services/oauth2/token"
    $body = @{
    grant_type="password";
    client_id="3MXXXXXXXX....";
    client_secret="111800.......";
    username="user@salesforce.com";
    password="myPasswordMyToken";
    }
    $token = (Invoke-RestMethod -Uri $uri -Method POST -Body $body).access_token
    
    return $headers = @{
    Authorization = "Bearer $token" 
    }
}

PS: In Powershell 3.0 gibts auch curl . Das ist ein Alias für Invoke-WebRequest, verhält sich aber oft gleich - ist aber nicht dasselbe :). Invoke-RestMethod bietet mehr Möglichkeiten im Umgang mit REST.