Basics of using Microsoft (MS) Graph PowerShell to update objects using Hashtables and JSON.
These are just some examples that could be used. By no means would I consider these the “best” way to handle each scenario, however, this should get you started in the right direction.
In general, a good thing to keep in mind, a Microsoft Graph type could be resembled as a PowerShell Hashtable or Array.
To create a PowerShell Hashtable, it would look like this…
$Hashtable = @{}
To create a PowerShell Array, it would look like this…
$Array = @()
I would recommend then converting these data type objects into JSON to attempt to avoid possible data type casting issues.
$json = $Hashtable | ConvertTo-Json -Compress -Depth 99
The –compress parameter removes many of the unnecessary spaces and special characters like new line characters and carriage return characters that might also cause problems.
The -depth parameter ensures the nested Hashtables are also converted.
Scenario: Simple JSON with no complex types
$Properties = @{ "city" = "Dallas" # String "birthday" = "1970-01-01T00:00:00Z" # DateTime "accountEnabled" = $true # Boolean "businessPhones" = @("+1 555-555-5551", "+1 555-555-5552") # Collection of strings } | ConvertTo-Json -Compress -Depth 99 Update-MgUser -UserId $userid -BodyParameter $Properties
Scenario: What if you wanted to update another complex type for a user? For example the password profile
$Properties = @{ "city" = "Dallas" # String "birthday" = "1970-01-01T00:00:00Z" # DateTime "accountEnabled" = $true # Boolean "businessPhones" = @("+1 555-555-5551", "+1 555-555-5552") # List of strings "passwordProfile" = @{ "forceChangePasswordNextSignIn" = $true "password" = "new_temp_password" } } | ConvertTo-Json -Compress -Depth 99 Update-MgUser -UserId $userid -BodyParameter $Properties
Scenario: What if it’s a collection of a complex type? for example the assignedLicenses
$Properties = @{ "city" = "Dallas" # String "birthday" = "1970-01-01T00:00:00Z" # DateTime "accountEnabled" = $true # Boolean "businessPhones" = @("+1 555-555-5551", "+1 555-555-5552") # List of strings "passwordProfile" = @{ "forceChangePasswordNextSignIn" = $true "password" = "new_temp_password" } "assignedLicenses" = @( @{ "skuId" = "06ebc4ee-1bb5-47dd-8120-11324bc54e06" "disabledPlans" = @("ded3d325-1bdc-453e-8432-5bac26d7a014") }, @{ "skuId" = "efccb6f7-5641-4e0e-bd10-b4976e1bf68e" "disabledPlans" = @("6c57d4b6-3b23-47a5-9bc9-69f17b4947b3") } ) } | ConvertTo-Json -Compress -Depth 99 Update-MgUser -UserId $userid -BodyParameter $Properties
Scenario: Or you can just convert a raw JSON string to something usable by MS Graph PowerShell
$Json = @' { "city": "Dallas", "birthday": "1970-01-01T00:00:00Z", "accountEnabled": true, "businessPhones": ["+1 555-555-5551", "+1 555-555-5552"], "passwordProfile": { "forceChangePasswordNextSignIn": true, "password": "new_temp_password" }, "assignedLicenses": [ { "skuId": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", "disabledPlans": ["ded3d325-1bdc-453e-8432-5bac26d7a014"] }, { "skuId": "efccb6f7-5641-4e0e-bd10-b4976e1bf68e", "disabledPlans": ["6c57d4b6-3b23-47a5-9bc9-69f17b4947b3"] } ] } '@ | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 99 Update-MgUser -UserId $userid -BodyParameter $Json
Scenario: Dynamically add additional properties
Let’s say we start with the following…
$Properties = @{ "city" = "Dallas" # String "birthday" = "1970-01-01T00:00:00Z" # DateTime "accountEnabled" = $true # Boolean "businessPhones" = @("+1 555-555-5551", "+1 555-555-5552") # Collection of strings }
Then later in the script you want to add another property like displayName…
$Properties.displayName = "John Smith"
Or you want to add something like the passwordProfile
$Properties.passwordProfile = @{} $Properties.passwordProfile.forceChangePasswordNextSignIn = $true $Properties.passwordProfile.password = "xxx"
Or if you want to add collections like assignedLicenses…
$Properties.assignedLicenses = @() $Properties.assignedLicenses += @{ "skuId" = "06ebc4ee-1bb5-47dd-8120-11324bc54e06" "disabledPlans" = @("ded3d325-1bdc-453e-8432-5bac26d7a014") }
Once you’re done adding additional properties, convert it to JSON and send it to MS Graph…
$json = $Properties | ConvertTo-Json -Compress -Depth 99 Update-MgUser -UserId $userid -BodyParameter $Json
More information
Learn more about working with PowerShell HashTables