0

I'm creating a powershell script to add users to a system via API request.

I have defined a variable below, it has a lot of escape characters because it's a json string which goes into the body of the request and otherwise it wasn't possible to define user data as variables in it, but this way it works.

$BODY_USERS = "{`"firstName`":`"${NAME}`", `"lastName`":`"${LASTNAME}`",`"email`":`"${EMAIL}`",`"enabled`":`"true`", `"username`":`"${USERNAME}`",`"credentials`":[{`"type`":`"password`",`"value`":`"Test12345789#`",`"temporary`":true}]}"

The command i execute to add a user is this one:

Invoke-RestMethod -Uri $URI_USERS -Method Post -Headers $HEADERS_USERS -Body $BODY_USERS

I would like to provide user related vars ($NAME, $LASTNAME etc) in a separate file. I did it for one user using dotsource - basically just defined abovementioned variables in a separate .ps1 file and referenced it in the script with . .\vars.ps1 and for one user it works just fine of course.

However if I need to construct a for loop for multiple users, I'm not sure what would be the best approach in this case.

Shall I define in my separate vars.ps1 file something like this:

$var=@($NAME='Jonny'; $LASTNAME='Doe'; $USERNAME='johnnydoe'; $EMAIL='[email protected]')

$var@($NAME='Jonny2'; $LASTNAME='Doe2'; $USERNAME='johnnydoe2'; $EMAIL='[email protected]')

and then use something like Get-Content "C:\Users\Desktop\vars.ps1" | ForEach-Object {do blahblah} in my script? But I'm not sure how it will be consumed by my $BODY_USERS variable. So I need to provide an array of variables to a variable, or something like that...

Being novice to powershell, i'm a little bit puzzled here.

Any advice is appreciated!

2
  • 1
    I don't know if I got it right but you don't need to create a json formatted object by yourself. You can use ConvertTo-JSON to let Powershell do it for you. ;-) Commented Feb 11, 2021 at 0:31
  • @Olaf it was a good remark, thank you. Commented Feb 11, 2021 at 10:26

1 Answer 1

5

As noted in comments, you don't need to construct JSON string manually. Create a hashtable for much cleaner syntax and convert to JSON string using ConvertTo-JSON. This also takes care of escaping characters that have special meaning in JSON, like " and \.

$BODY_USERS = @{
    firstName = $NAME
    lastName = $LASTNAME
    email = $EMAIL
    enabled = $true
    username = $USERNAME
    credentials = @(
        @{ type = "password"; value = "Test12345789#"; temporary = $true }
    )
}

$BODY_USERS_JSON = ConvertTo-JSON $BODY_USERS

Invoke-RestMethod -Uri $URI_USERS -Method Post -Headers $HEADERS_USERS -Body $BODY_USERS_JSON

For multiple users you could store the data in a CSV file, which are quite easy to handle with PowerShell:

Users.csv

name,lastname,username,email
Jonny,Doe,johnnydoe,[email protected]
Jonny2,Doe2,johnnydoe2,[email protected]

Now we can process the users.csv like this:

$allUsers = Import-Csv users.csv

$allUsers  # List users only for debugging purposes

foreach( $user in $allUsers ) {
    $BODY_USERS = @{
        firstName = $user.NAME
        lastName = $user.LASTNAME
        email = $user.EMAIL
        enabled = $true
        username = $user.USERNAME
        credentials = @(
            @{ type = "password"; value = "Test12345789#"; temporary = $true }
        )
    }

    $BODY_USERS_JSON = ConvertTo-JSON $BODY_USERS

    Invoke-RestMethod -Uri $URI_USERS -Method Post -Headers $HEADERS_USERS -Body $BODY_USERS_JSON
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks a million for this detailed explanation, that was very useful and works like a charm.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.