C# / .NETDevOpsMisc
Work with a REST API using PowerShell
Alexandru Puiu
Alexandru Puiu
February 11, 2020
1 min

A well-designed REST API can be consumed and interacted with in many ways. Powershell is one of those really useful ones because it’s very dynamic. We’ll also consider that the API is protected using JWT Bearer tokens by an OpenID Connect server. Our example API, in this case, is a simple REST API to query and manage users.

Set required headers:

Adding the bearer token manually to the script in this case, but this step could be automated as well although it’s a lot more involved to initially set up. See the following guide for one way of doing this https://docs.microsoft.com/en-us/information-protection/develop/concept-authentication-acquire-token-ps

$headers = @{}
$headers["Accept"] = "application/json"
$headers["Authorization"] = "Bearer 3a5e90b25ac028ec968def29d0055d418265e9810968eb4a0c531a45fee3b00f"

Add script to use TLS 1.2:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Add an app name to the Apps collection of a user:

curl -Method Patch -ContentType application/json-patch+json -Headers $headers -Body ’[ { “value”: “App Name”, “path”: “/apps”, “op”: “add” } ]’ ’https://example.com/api/users/[email address or userid]’

Change a user’s first name:

curl -Method Patch -ContentType application/json-patch+json -Headers $headers -Body '[ { "value": "New First Name", "path": "/firstName", "op": "replace" } ]' 'https://example.com/api/users/[email address or userid]'

Add users from a text file with one email or user id per line

foreach ($user in get-content c:\data\users.txt) {
curl -Method Patch -ContentType application/json-patch+json -Headers $headers -Body '[ { "value": "App Name", "path": "/apps", "op": "add" } ]' 'https://example.com/api/users/$user'

Create users from a csv with headers “firstName, lastName, email”, set a default password and list of Apps

Import-CSV C:\data\users.csv | Foreach-Object {
    Write-Host "Importing $($_.email)"
    curl -Method Post -ContentType application/json -Headers $headers -Body "{
  'firstName': '$($_.firstName)',
  'lastName': '$($_.lastName)',
  'email': '$($_.email)',
  'password': 'myPassword',
  'organization': 'Test Organization',
  'apps': [
    'App Name'
  'changePasswordOnNextLogin': false
}" 'https://example.com/api/Users/'

Given a list of email addresses, export select user info fields to a CSV

$userList = get-content c:\data\usernames.csv;
$users = New-Object System.Collections.ArrayList
foreach ($user in $userList.Where({ $_ -ne ""})) {
    Write-Host "Getting user $user"
    try {
        $userData = Invoke-RestMethod -Method Get -ContentType application/json -Headers $headers "https://example.com/api/users/$user";
    catch {
        $userData = $null;
    $userInfo = @{};
    if (!$userData) {
        $userInfo.Exists = "no";
    } else {
        $userInfo.Exists = "yes";
        $userInfo.FirstName = $userData.firstName
        $userInfo.LastName = $userData.lastName
        $userInfo.Organization = $userData.organization
        $userInfo.UserId = $userData.userId
    $users.Add((New-Object PSObject -Property $userInfo)) | Out-Null
$users | export-csv c:\data\userinfo.csv -NoTypeInformation


Alexandru Puiu

Alexandru Puiu

Engineer / Security Architect

Systems Engineering advocate, Software Engineer, Security Architect / Researcher, SQL/NoSQL DBA, and Certified Scrum Master with a passion for Distributed Systems, AI and IoT..



Social Media


Related Posts

Flutter Feature Flags
A Comprehensive Guide to Implementing Feature Flags in Flutter
April 14, 2023
3 min

Subscribe To My Newsletter

I'll only send worthwhile content I think you'll want, less than once a month, and promise to never spam or sell your information!
© 2023, All Rights Reserved.

Quick Links

Get In TouchAbout Me

Social Media