Public/Remove-iPilotTeamsUserAssignment.ps1
Function Remove-iPilotTeamsUserAssignment { <# .Synopsis Deprovisions a user in iPilot .Description Deprovisions a user's iPilot telephone number with the provided User Principal Name .Parameter UserPrincipalName User's User Principal Name. .Parameter ApiVersion Version of the iPilot to use. Defaults to v1. .Parameter iPilotDomain iPilot Domain Name. .Example # Deprovisions jdoe@contoso.com's iPilot number using API Version v1 in the contoso.com iPilot domain Remove-iPilotTeamsUserAssignment -UserPrincipalName jdoe@contoso.com -iPilotDomain contoso.com #> Param ( [System.String] [Parameter(Mandatory = $true)] $UserPrincipalName, [System.String] $ApiUrl = "https://api.nuwave.com", [System.String] $ApiVersion = "v1", [System.String] $ApiKey, [System.String] $iPilotDomain, [Switch] $Wait, [System.Management.Automation.PSCredential] $Credential ) Begin { # Assign variables from dynamic parameters If ($UserPrincipalName -and $UserPrincipalName -notlike "*@*.*") { throw "Check the formatting of the user's User Principal Name. Format should be jdoe@contoso.com" } # Set iPilot Domain if (!$global:IP_iPilotDomain -and !$iPilotDomain) { throw "Run Get-iPilotTeamsDomain or provide domain using -iPilotDomain" } elseif (!$iPilotDomain) { $iPilotDomain = $global:IP_iPilotDomain Write-Verbose "iPilot Domain: $iPilotDomain" } # else use passed in iPilotDomain } Process { # Verbose Switch if($PSBoundParameters.containskey("Verbose")) { $PreviousVerbosePreference = $VerbosePreference $VerbosePreference = "continue" } # Debug Switch if($PSBoundParameters.containskey("Debug")) { $PreviousDebugPreference = $DebugPreference $DebugPreference = "continue" } # Get/re-use OAuth Token $InitializeiPilotSessionSplat = @{ ApiUrl = $ApiUrl ApiVersion = $ApiVersion ApiKey = $ApiKey Credential = $Credential } if ($global:IP_Instance) { $InitializeiPilotSessionSplat += @{ Instance = $global:IP_Instance } } if ($VerbosePreference -eq "Continue") { $InitializeiPilotSessionSplat += @{ Verbose = $true } } if ($DebugPreference -eq "Continue") { $InitializeiPilotSessionSplat += @{ Debug = $true } } Initialize-iPilotSession @InitializeiPilotSessionSplat # Get user's iPilot ID $User = Get-iPilotTeamsUser -FilterByUserPrincipalName $UserPrincipalName -iPilotDomain $iPilotDomain -Credential $Credential # Build iPilot API Request $RemoveiPilotUserRequestUri = "$ApiUrl/$ApiVersion/msteams/$iPilotDomain/users/$($User.id)" if ($global:IP_Instance) { $RemoveiPilotUserRequestUri += "?instance=$global:IP_Instance" } Write-Verbose "RemoveiPilotUserRequestUri: $RemoveiPilotUserRequestUri" #region Build Request Body Write-Verbose "Request Method: Delete" # Splat Invoke-RestMethod Parameters $RemoveiPilotUserInvokeParams = @{ Uri = $RemoveiPilotUserRequestUri Method = "Delete" ContentType = "application/json" Headers = @{ "X-Access-Token" = $global:IP_iPilotOAuthToken.access_token "x-api-key" = $global:IP_iPilotApiKey } } # Execute the REST API Try { $RemoveiPilotUserResponse = Invoke-RestMethod @RemoveiPilotUserInvokeParams return $RemoveiPilotUserResponse } Catch { $InvokeRestMethodError = $_.Exception if ($InvokeRestMethodError.Response.StatusCode.value__ -eq 404) { Write-Error "iPilot user $($UserPrincipalName) could not be found.`n Status: $($InvokeRestMethodError.Response.StatusCode.value__)`n URL: $($RemoveiPilotUserRequestUri)`n Exception: $($Error[0])`n Status:$($RemoveiPilotUserResponse.status)`n Error:$($RemoveiPilotUserResponse.data | Format-Table | Out-String)" } elseif ($InvokeRestMethodError.Response.StatusCode.value__ -eq 404) { Write-Error "iPilot OAuth token invalid. Unauthorized. Please re-authenticate with Get-iPilotOAuthToken.`n Status: $($InvokeRestMethodError.Response.StatusCode.value__)`n URL: $($RemoveiPilotUserRequestUri)`n Exception: $($Error[0])`n Status:$($RemoveiPilotUserResponse.status)`n Error:$($RemoveiPilotUserResponse.data | Format-Table | Out-String)" } elseif ($InvokeRestMethodError.Response.StatusCode.value__ -eq 400) { Write-Error "$($InvokeRestMethodError.Response.StatusDescription)`n Status: $($InvokeRestMethodError.Response.StatusCode.value__)`n URL: $($RemoveiPilotUserRequestUri)`n Exception: $($Error[0])`n Status:$($RemoveiPilotUserResponse.status)`n Error:$($RemoveiPilotUserResponse.data | Format-Table | Out-String)" } elseif ($InvokeRestMethodError.Response.StatusCode.value__ -eq 406) { Write-Error "$($InvokeRestMethodError.Response.StatusDescription)`n Status: $($InvokeRestMethodError.Response.StatusCode.value__)`n URL: $($RemoveiPilotUserRequestUri)`n Exception: $($Error[0])`n Status:$($RemoveiPilotUserResponse.status)`n Error:$($RemoveiPilotUserResponse.data | Format-Table | Out-String)" } else { Write-Error "iPilot user $($UserPrincipalName) could not be deprovisioned.`n Status: $($InvokeRestMethodError.Response.StatusCode.value__)`n URL: $($RemoveiPilotUserRequestUri)`n Exception: $($Error[0])`n Status:$($RemoveiPilotUserResponse.status)`n Error:$($RemoveiPilotUserResponse.data | Format-Table | Out-String)" } break } # Return Available Numbers if ($RemoveiPilotUserResponse.statuscode -eq 200) { Write-Output "Successfully triggered deprovisioning of iPilot User.`nUPN: $UserPrincipalName`nTelephoneNumber: $TelephoneNumber)" # Wait for user to be removed, else exit immediately if ($Wait.IsPresent) { Do { $User = Get-iPilotTeamsUser -FilterByUserPrincipalName $UserPrincipalName if ($User.Status -eq "FAILED_TO_UNASSIGN") { Write-Error "Failed to unassign $UserPrincipalName from $($TelephoneNumber.TelephoneNumber)" exit 1 } if ($User.Status -notlike "No data found*") { Write-Output "$UserPrincipalName status is $($User.Status), waiting 30 seconds to refresh status" Start-Sleep -Seconds 30 } } While ($User.Status -like "No data found*") } } else { Write-Error "Failed to remove iPilot User.`n UPN: $UserPrincipalName`n TelephoneNumber: $TelephoneNumber`n Status:$($RemoveiPilotUserResponse.status)`n Error:$($RemoveiPilotUserResponse.data | Format-Table | Out-String)" } # Verbose Switch if($PSBoundParameters.containskey("Verbose")) { $VerbosePreference = $PreviousVerbosePreference } # Debug Switch if($PSBoundParameters.containskey("Debug")) { $DebugPreference = $PreviousDebugPreference } } } |