Skip to content

Commit 0f4549a

Browse files
Merge pull request KelvinTegelaar#1224 from kris6673/edit-othermails
Add support for editing the otherMails attribute
2 parents 3533643 + ad28496 commit 0f4549a

File tree

2 files changed

+62
-54
lines changed

2 files changed

+62
-54
lines changed

Diff for: Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Administration/Users/Invoke-EditUser.ps1

+58-51
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ Function Invoke-EditUser {
1010
[CmdletBinding()]
1111
param($Request, $TriggerMetadata)
1212

13-
$APIName = $TriggerMetadata.FunctionName
14-
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -message 'Accessed this API' -Sev 'Debug'
13+
$ApiName = $TriggerMetadata.FunctionName
14+
$User = $Request.headers.'x-ms-client-principal'
15+
Write-LogMessage -user $User -API $ApiName -message 'Accessed this API' -Sev 'Debug'
1516

1617
$UserObj = $Request.body
1718
if ($UserObj.id -eq '') {
@@ -32,103 +33,107 @@ Function Invoke-EditUser {
3233
Write-Host 'PowerShell HTTP trigger function processed a request.'
3334
#Edit the user
3435
try {
35-
Write-Host "$([boolean]$UserObj.mustchangepass)"
36-
$UserprincipalName = "$($UserObj.Username ? $userobj.username :$userobj.mailNickname)@$($UserObj.Domain ? $UserObj.Domain : $UserObj.primDomain.value)"
36+
Write-Host "$([boolean]$UserObj.MustChangePass)"
37+
$UserPrincipalName = "$($UserObj.Username ? $UserObj.username :$UserObj.mailNickname)@$($UserObj.Domain ? $UserObj.Domain : $UserObj.primDomain.value)"
3738
$BodyToship = [pscustomobject] @{
38-
'givenName' = $UserObj.givenname
39+
'givenName' = $UserObj.givenName
3940
'surname' = $UserObj.surname
4041
'accountEnabled' = $true
4142
'displayName' = $UserObj.displayName
4243
'department' = $UserObj.Department
43-
'mailNickname' = $UserObj.Username ? $userobj.username :$userobj.mailNickname
44-
'userPrincipalName' = $UserprincipalName
44+
'mailNickname' = $UserObj.Username ? $UserObj.username :$UserObj.mailNickname
45+
'userPrincipalName' = $UserPrincipalName
4546
'usageLocation' = $UserObj.usageLocation.value ? $UserObj.usageLocation.value : $UserObj.usageLocation
4647
'city' = $UserObj.City
4748
'country' = $UserObj.Country
48-
'jobtitle' = $UserObj.Jobtitle
49+
'jobTitle' = $UserObj.jobTitle
4950
'mobilePhone' = $UserObj.MobilePhone
5051
'streetAddress' = $UserObj.streetAddress
5152
'postalCode' = $UserObj.PostalCode
5253
'companyName' = $UserObj.CompanyName
54+
'otherMails' = @($UserObj.otherMails)
5355
'passwordProfile' = @{
5456
'forceChangePasswordNextSignIn' = [bool]$UserObj.MustChangePass
5557
}
5658
} | ForEach-Object {
57-
$NonEmptyProperties = $_.psobject.Properties | Select-Object -ExpandProperty Name
59+
$NonEmptyProperties = $_.PSObject.Properties | Select-Object -ExpandProperty Name
5860
$_ | Select-Object -Property $NonEmptyProperties
5961
}
6062
if ($UserObj.addedAttributes) {
6163
Write-Host 'Found added attribute'
6264
Write-Host "Added attributes: $($UserObj.addedAttributes | ConvertTo-Json)"
63-
$UserObj.addedAttributes.getenumerator() | ForEach-Object {
64-
$results.add("Edited property $($_.Key) with value $($_.Value)")
65+
$UserObj.addedAttributes.GetEnumerator() | ForEach-Object {
66+
$null = $results.Add("Edited property $($_.Key) with value $($_.Value)")
6567
$bodytoShip | Add-Member -NotePropertyName $_.Key -NotePropertyValue $_.Value -Force
6668
}
6769
}
6870
$bodyToShip = ConvertTo-Json -Depth 10 -InputObject $BodyToship -Compress
69-
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $userObj.tenantFilter -type PATCH -body $BodyToship -verbose
70-
$results.add( 'Success. The user has been edited.' )
71-
Write-LogMessage -API $APINAME -tenant ($userObj.tenantFilter) -user $request.headers.'x-ms-client-principal' -message "Edited user $($UserObj.DisplayName) with id $($UserObj.id)" -Sev 'Info'
71+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $UserObj.tenantFilter -type PATCH -body $BodyToship -verbose
72+
$null = $results.Add( 'Success. The user has been edited.' )
73+
Write-LogMessage -API $ApiName -tenant ($UserObj.tenantFilter) -user $User -message "Edited user $($UserObj.DisplayName) with id $($UserObj.id)" -Sev Info
7274
if ($UserObj.password) {
73-
$passwordProfile = [pscustomobject]@{'passwordProfile' = @{ 'password' = $UserObj.password; 'forceChangePasswordNextSignIn' = [boolean]$UserObj.mustchangepass } } | ConvertTo-Json
74-
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $userObj.tenantFilter -type PATCH -body $PasswordProfile -verbose
75-
$results.add("Success. The password has been set to $($UserObj.password)")
76-
Write-LogMessage -API $APINAME -tenant ($userObj.tenantFilter) -user $request.headers.'x-ms-client-principal' -message "Reset $($UserObj.DisplayName)'s Password" -Sev 'Info'
75+
$passwordProfile = [pscustomobject]@{'passwordProfile' = @{ 'password' = $UserObj.password; 'forceChangePasswordNextSignIn' = [boolean]$UserObj.MustChangePass } } | ConvertTo-Json
76+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $UserObj.tenantFilter -type PATCH -body $PasswordProfile -verbose
77+
$null = $results.Add("Success. The password has been set to $($UserObj.password)")
78+
Write-LogMessage -API $ApiName -tenant ($UserObj.tenantFilter) -user $User -message "Reset $($UserObj.DisplayName)'s Password" -Sev Info
7779
}
7880
} catch {
79-
Write-LogMessage -API $APINAME -tenant ($userObj.tenantFilter) -user $request.headers.'x-ms-client-principal' -message "User edit API failed. $($_.Exception.Message)" -Sev 'Error'
80-
$results.add( "Failed to edit user. $($_.Exception.Message)")
81+
$ErrorMessage = Get-CippException -Exception $_
82+
Write-LogMessage -API $ApiName -tenant ($UserObj.tenantFilter) -user $User -message "User edit API failed. $($ErrorMessage.NormalizedError)" -Sev Error -LogData $ErrorMessage
83+
$null = $results.Add( "Failed to edit user. $($ErrorMessage.NormalizedError)")
8184
}
8285

8386

8487
#Reassign the licenses
8588
try {
8689

8790
if ($licenses -or $UserObj.removeLicenses) {
88-
$CurrentLicenses = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $userObj.tenantFilter
91+
$CurrentLicenses = New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $UserObj.tenantFilter
8992
#if the list of skuIds in $CurrentLicenses.assignedLicenses is EXACTLY the same as $licenses, we don't need to do anything, but the order in both can be different.
9093
if (($CurrentLicenses.assignedLicenses.skuId -join ',') -eq ($licenses -join ',') -and $UserObj.removeLicenses -eq $false) {
9194
Write-Host "$($CurrentLicenses.assignedLicenses.skuId -join ',') $(($licenses -join ','))"
92-
$results.add( 'Success. User license is already correct.' )
95+
$null = $results.Add( 'Success. User license is already correct.' )
9396
} else {
9497
if ($UserObj.removeLicenses) {
95-
$licResults = Set-CIPPUserLicense -userid $UserObj.id -TenantFilter $UserObj.tenantFilter -RemoveLicenses $CurrentLicenses.assignedLicenses.skuId
96-
$results.add($licResults)
98+
$licResults = Set-CIPPUserLicense -UserId $UserObj.id -TenantFilter $UserObj.tenantFilter -RemoveLicenses $CurrentLicenses.assignedLicenses.skuId
99+
$null = $results.Add($licResults)
97100
} else {
98101
#Remove all objects from $CurrentLicenses.assignedLicenses.skuId that are in $licenses
99102
$RemoveLicenses = $CurrentLicenses.assignedLicenses.skuId | Where-Object { $_ -notin $licenses }
100-
$licResults = Set-CIPPUserLicense -userid $UserObj.id -TenantFilter $UserObj.tenantFilter -RemoveLicenses $RemoveLicenses -AddLicenses $licenses
101-
$results.add($licResults)
103+
$licResults = Set-CIPPUserLicense -UserId $UserObj.id -TenantFilter $UserObj.tenantFilter -RemoveLicenses $RemoveLicenses -AddLicenses $licenses
104+
$null = $results.Add($licResults)
102105
}
103106

104107
}
105108
}
106109

107110
} catch {
108-
Write-LogMessage -API $APINAME -tenant ($userObj.tenantFilter) -user $request.headers.'x-ms-client-principal' -message "License assign API failed. $($_.Exception.Message)" -Sev 'Error'
109-
$results.add( "We've failed to assign the license. $($_.Exception.Message)")
111+
$ErrorMessage = Get-CippException -Exception $_
112+
Write-LogMessage -API $ApiName -tenant ($UserObj.tenantFilter) -user $User -message "License assign API failed. $($ErrorMessage.NormalizedError)" -Sev Error -LogData $ErrorMessage
113+
$null = $results.Add( "We've failed to assign the license. $($ErrorMessage.NormalizedError)")
110114
}
111115

112116
#Add Aliases, removal currently not supported.
113117
try {
114118
if ($Aliases) {
115119
Write-Host ($Aliases | ConvertTo-Json)
116120
foreach ($Alias in $Aliases) {
117-
New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $userObj.tenantFilter -type 'patch' -body "{`"mail`": `"$Alias`"}" -verbose
121+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $UserObj.tenantFilter -type 'patch' -body "{`"mail`": `"$Alias`"}" -Verbose
118122
}
119-
New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $userObj.tenantFilter -type 'patch' -body "{`"mail`": `"$UserprincipalName`"}" -verbose
120-
Write-LogMessage -API $APINAME -tenant ($userObj.tenantFilter) -user $request.headers.'x-ms-client-principal' -message "Added Aliases to $($UserObj.DisplayName)" -Sev 'Info'
121-
$results.add( 'Success. added aliases to user.')
123+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)" -tenantid $UserObj.tenantFilter -type 'patch' -body "{`"mail`": `"$UserPrincipalName`"}" -Verbose
124+
Write-LogMessage -API $ApiName -tenant ($UserObj.tenantFilter) -user $User -message "Added Aliases to $($UserObj.DisplayName)" -Sev Info
125+
$null = $results.Add( 'Success. added aliases to user.')
122126
}
123127

124128
} catch {
125-
Write-LogMessage -API $APINAME -tenant ($userObj.tenantFilter) -user $request.headers.'x-ms-client-principal' -message "Alias API failed. $($_.Exception.Message)" -Sev 'Error'
126-
$results.add( "Successfully edited user. The password is $password. We've failed to create the Aliases: $($_.Exception.Message)")
129+
$ErrorMessage = Get-CippException -Exception $_
130+
Write-LogMessage -API $ApiName -tenant ($UserObj.tenantFilter) -user $User -message "Alias API failed. $($ErrorMessage.NormalizedError)" -Sev Error -LogData $ErrorMessage
131+
$null = $results.Add( "Successfully edited user. The password is $password. We've failed to create the Aliases: $($ErrorMessage.NormalizedError)")
127132
}
128133

129134
if ($Request.body.CopyFrom.value) {
130-
$CopyFrom = Set-CIPPCopyGroupMembers -ExecutingUser $request.headers.'x-ms-client-principal' -CopyFromId $Request.body.CopyFrom.value -UserID $UserprincipalName -TenantFilter $userObj.tenantFilter
131-
$results.AddRange($CopyFrom)
135+
$CopyFrom = Set-CIPPCopyGroupMembers -ExecutingUser $User -CopyFromId $Request.body.CopyFrom.value -UserID $UserPrincipalName -TenantFilter $UserObj.tenantFilter
136+
$null = $results.AddRange($CopyFrom)
132137
}
133138

134139
if ($AddToGroups) {
@@ -145,7 +150,7 @@ Function Invoke-EditUser {
145150

146151
Write-Host 'Adding to group via Add-DistributionGroupMember '
147152
$Params = @{ Identity = $GroupID; Member = $UserObj.id; BypassSecurityGroupManagerCheck = $true }
148-
New-ExoRequest -tenantid $userObj.tenantFilter -cmdlet 'Add-DistributionGroupMember' -cmdParams $params -UseSystemMailbox $true
153+
$null = New-ExoRequest -tenantid $UserObj.tenantFilter -cmdlet 'Add-DistributionGroupMember' -cmdParams $params -UseSystemMailbox $true
149154

150155
} else {
151156

@@ -154,25 +159,26 @@ Function Invoke-EditUser {
154159
'@odata.id' = "https://graph.microsoft.com/beta/directoryObjects/$($UserObj.id)"
155160
}
156161
$UserBodyJSON = ConvertTo-Json -Compress -Depth 10 -InputObject $UserBody
157-
New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$GroupID/members/`$ref" -tenantid $userObj.tenantFilter -type POST -body $UserBodyJSON -Verbose
162+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$GroupID/members/`$ref" -tenantid $UserObj.tenantFilter -type POST -body $UserBodyJSON -Verbose
158163

159164
}
160165

161-
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -tenant $userObj.tenantFilter -message "Added $($UserObj.DisplayName) to $GroupName group" -Sev 'Info'
162-
$null = $results.add("Success. $($UserObj.DisplayName) has been added to $GroupName")
166+
Write-LogMessage -user $User -API $ApiName -tenant $UserObj.tenantFilter -message "Added $($UserObj.DisplayName) to $GroupName group" -Sev Info
167+
$null = $results.Add("Success. $($UserObj.DisplayName) has been added to $GroupName")
163168
} catch {
164-
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -tenant $userObj.tenantFilter -message "Failed to add member $($UserObj.DisplayName) to $GroupName. Error:$($_.Exception.Message)" -Sev 'Error'
165-
$null = $results.add("Failed to add member $($UserObj.DisplayName) to $GroupName : $($_.Exception.Message)")
169+
$ErrorMessage = Get-CippException -Exception $_
170+
Write-LogMessage -user $User -API $ApiName -tenant $UserObj.tenantFilter -message "Failed to add member $($UserObj.DisplayName) to $GroupName. Error:$($ErrorMessage.NormalizedError)" -Sev Error -LogData $ErrorMessage
171+
$null = $results.Add("Failed to add member $($UserObj.DisplayName) to $GroupName : $($ErrorMessage.NormalizedError)")
166172
}
167173

168174
}
169175
}
170176
if ($Request.body.setManager.value) {
171177
$ManagerBody = [PSCustomObject]@{'@odata.id' = "https://graph.microsoft.com/beta/users/$($Request.body.setManager.value)" }
172178
$ManagerBodyJSON = ConvertTo-Json -Compress -Depth 10 -InputObject $ManagerBody
173-
New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)/manager/`$ref" -tenantid $userObj.tenantFilter -type PUT -body $ManagerBodyJSON -Verbose
174-
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -tenant $userObj.tenantFilter -message "Set $($UserObj.DisplayName)'s manager to $($Request.body.setManager.label)" -Sev 'Info'
175-
$results.add("Success. Set $($UserObj.DisplayName)'s manager to $($Request.body.setManager.label)")
179+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$($UserObj.id)/manager/`$ref" -tenantid $UserObj.tenantFilter -type PUT -body $ManagerBodyJSON -Verbose
180+
Write-LogMessage -user $User -API $ApiName -tenant $UserObj.tenantFilter -message "Set $($UserObj.DisplayName)'s manager to $($Request.body.setManager.label)" -Sev Info
181+
$null = $results.Add("Success. Set $($UserObj.DisplayName)'s manager to $($Request.body.setManager.label)")
176182
}
177183

178184
if ($RemoveFromGroups) {
@@ -189,20 +195,21 @@ Function Invoke-EditUser {
189195

190196
Write-Host 'Removing From group via Remove-DistributionGroupMember '
191197
$Params = @{ Identity = $GroupID; Member = $UserObj.id; BypassSecurityGroupManagerCheck = $true }
192-
New-ExoRequest -tenantid $userObj.tenantFilter -cmdlet 'Remove-DistributionGroupMember' -cmdParams $params -UseSystemMailbox $true
198+
$null = New-ExoRequest -tenantid $UserObj.tenantFilter -cmdlet 'Remove-DistributionGroupMember' -cmdParams $params -UseSystemMailbox $true
193199

194200
} else {
195201

196202
Write-Host 'Removing From group via Graph'
197-
New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$GroupID/members/$($UserObj.id)/`$ref" -tenantid $userObj.tenantFilter -type DELETE
203+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$GroupID/members/$($UserObj.id)/`$ref" -tenantid $UserObj.tenantFilter -type DELETE
198204

199205
}
200206

201-
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -tenant $userObj.tenantFilter -message "Removed $($UserObj.DisplayName) from $GroupName group" -Sev 'Info'
202-
$null = $results.add("Success. $($UserObj.DisplayName) has been removed from $GroupName")
207+
Write-LogMessage -user $User -API $ApiName -tenant $UserObj.tenantFilter -message "Removed $($UserObj.DisplayName) from $GroupName group" -Sev Info
208+
$null = $results.Add("Success. $($UserObj.DisplayName) has been removed from $GroupName")
203209
} catch {
204-
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APINAME -tenant $userObj.tenantFilter -message "Failed to remove member $($UserObj.DisplayName) from $GroupName. Error:$($_.Exception.Message)" -Sev 'Error'
205-
$null = $results.add("Failed to remove member $($UserObj.DisplayName) from $GroupName : $($_.Exception.Message)")
210+
$ErrorMessage = Get-CippException -Exception $_
211+
Write-LogMessage -user $User -API $ApiName -tenant $UserObj.tenantFilter -message "Failed to remove member $($UserObj.DisplayName) from $GroupName. Error:$($ErrorMessage.NormalizedError)" -Sev Error -LogData $ErrorMessage
212+
$null = $results.Add("Failed to remove member $($UserObj.DisplayName) from $GroupName : $($ErrorMessage.NormalizedError)")
206213
}
207214

208215
}

Diff for: Modules/CIPPCore/Public/Set-CIPPUserLicense.ps1

+4-3
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ function Set-CIPPUserLicense {
2727
Write-Host "License body JSON: $LicenseBodyJson"
2828

2929
try {
30-
$LicRequest = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$UserId/assignLicense" -tenantid $TenantFilter -type POST -body $LicenseBodyJson -Verbose
30+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/users/$UserId/assignLicense" -tenantid $TenantFilter -type POST -body $LicenseBodyJson -Verbose
3131
} catch {
32-
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APIName -tenant $TenantFilter -message "Failed to assign the license. Error: $_" -Sev 'Error'
33-
throw "Failed to assign the license. $_"
32+
$ErrorMessage = Get-CippException -Exception $_
33+
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APIName -tenant $TenantFilter -message "Failed to assign the license. Error: $($ErrorMessage.NormalizedError)" -Sev Error -LogData $ErrorMessage
34+
throw "Failed to assign the license. $($ErrorMessage.NormalizedError)"
3435
}
3536

3637
Write-LogMessage -user $request.headers.'x-ms-client-principal' -API $APIName -tenant $TenantFilter -message "Assigned licenses to user $UserId. Added: $AddLicenses; Removed: $RemoveLicenses" -Sev 'Info'

0 commit comments

Comments
 (0)