functions/Public/Methods/Get-Mga.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
function Get-Mga {
    <#
    .LINK
    https://github.com/baswijdenes/Optimized.Mga/
 
    .LINK
    https://baswijdenes.com/c/microsoft/mga/
 
    .SYNOPSIS
    Get-Mga is an Alias for the method Get.
     
    .DESCRIPTION
    Gets an object in the Azure AD tenant with the Microsoft Graph API.
    Json, XML, and CSV is converted to a PSObject.
 
    .PARAMETER Uri
    Uri to the Microsoft Graph API.
    You can also use the last part of an Uri and the rest will be automatically added.
    Example: /users
    Example: https://graph.microsoft.com/v1.0/users
    Example: users?$filter=displayName eq 'Bas Wijdenes'
    Example: beta/users
 
    .PARAMETER SkipNextLink
    When you use this switch it will only return the first data result of the response without checking the NextDataLink URL.
 
    .PARAMETER Api
    This is not a mandatory parameter.
    By using v1.0 or beta it will always overwrite the value given in the Uri.
    By using All it will first try v1.0 in a try and catch. and when it jumps to the catch it will use the beta Api.
 
    .PARAMETER CustomHeader
    This not a not mandatory parameter, there is a default header containing application/json.
    By using this parameter you can add a custom header. The CustomHeader is reverted back to the original after the cmdlet has run.
 
    .PARAMETER ReturnAsJson
    This is not a mandatory parameter.
    By using, this the output will be returned as Json.
    When it cannot be converted to json, it will be returned as is.
 
    .PARAMETER Top
    This is not a mandatory parameter. It accepts an integer only.
    This is a query parameter:
    https://learn.microsoft.com/en-us/graph/query-parameters
 
    .PARAMETER Skip
    This is not a mandatory parameter. It accepts an integer only.
    This is a query parameter:
    https://learn.microsoft.com/en-us/graph/query-parameters
 
    .PARAMETER Count
    This is not a mandatory parameter. This is a switch parameter.
    This is a query parameter:
    https://learn.microsoft.com/en-us/graph/query-parameters#count-parameter
 
    .PARAMETER OrderBy
    This is not a mandatory parameter. This is a string value and only accepts one string.
    This is a query parameter:
    https://learn.microsoft.com/en-us/graph/query-parameters
 
    .PARAMETER Expand
    This is not a mandatory parameter. This is a string value and only accepts one string.
    This is a query parameter:
    https://learn.microsoft.com/en-us/graph/query-parameters
 
 
    .PARAMETER Select
    This is not a mandatory parameter. This is a string value and accepts a string array.
    This is a query parameter:
    https://learn.microsoft.com/en-us/graph/query-parameters
     
    .EXAMPLE
    Get-Mga -Uri 'v1.0/users' -SkipNextLink
 
    .EXAMPLE
    Get-Mga -Uri 'users?$top=999'
 
    .EXAMPLE
    Get-Mga -Uri 'https://graph.microsoft.com/v1.0/users/Testuser@baswijdenes.com'
 
    .EXAMPLE
    $Uri = 'https://graph.microsoft.com/v1.0/users?$select=id,userPrincipalName,lastPasswordChangeDateTime,createdDateTime,PasswordPolicies'
    Get-Mga -Uri $Uri -Api 'All'
 
    .EXAMPLE
    $Uri = '/beta/users?$filter=(UserType eq 'Guest')&$select=displayName,userPrincipalName,createdDateTime,signInActivity'
    Get-Mga -Uri $Uri -Api 'v1.0'
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias('URL')]
        [string]$Uri,
        [Parameter(Mandatory = $false)]
        [Alias('Once')]      
        [switch]$SkipNextLink,
        [Parameter(Mandatory = $false)]      
        [ValidateSet('All', 'v1.0', 'beta')]
        [Alias('Reference')]
        [string]$Api,
        [Parameter(Mandatory = $false)]
        [object]$CustomHeader,
        [Parameter(Mandatory = $false)]
        [switch]$ReturnAsJson,
        [Parameter(Mandatory = $false)]
        [int]$Top,
        [Parameter(Mandatory = $false)]
        [int]$Skip,
        [Parameter(Mandatory = $false)]
        [switch]$Count,
        [Parameter(Mandatory = $false)]
        [string]$OrderBy,
        [Parameter(Mandatory = $false)]
        [string]$Expand,
        [Parameter(Mandatory = $false)]
        [string[]]$Select
    )
    begin {
        try {
            $StartMgaBeginDefault = Start-MgaBeginDefault -CustomHeader $CustomHeader -Api $Api -Uri $Uri
            $ConvertToMgaQuerySplat = @{
                Uri     = $StartMgaBeginDefault.Uri
                Top     = $Top
                Skip    = $Skip
                Count   = $Count
                Expand  = $Expand
                OrderBy = $OrderBy
                Select  = $Select
            }
            $Uri = ConvertTo-MgaQuery @ConvertToMgaQuerySplat
            $UpdateMgaUriApi = $StartMgaBeginDefault
            $InvokeWebRequestSplat = @{
                Headers         = $Script:MgaSession.HeaderParameters
                Uri             = $Uri
                Method          = 'Get'
                UseBasicParsing = $true
            }
        }
        catch {
            throw $_
        }
    }
    process {
        try {
            $Result = Invoke-WebRequest @InvokeWebRequestSplat
            if ($result.Headers.'Content-Type' -like 'application/octet-stream;*') {
                Write-Verbose 'Converting response from CSV to PSObject'
                $EndResult = ConvertFrom-Csv -Body $Result
            }
            if ($result.Headers.'Content-Type' -like 'application/json;*') {   
                Write-Verbose 'Converting response from JSON to PSObject'
                $Result = ConvertFrom-Json -InputObject $Result
                $EndResult = @()
                $EndResult += ConvertTo-MgaResult -Response $Result
                if (-not($SkipNextLink)) {
                    While ($Result.'@odata.nextLink') {
                        Write-Verbose '@odata.nextLink property found, invoking again for more data'
                        Update-MgaOauthToken
                        $InvokeWebRequestSplat.Uri = $Result.'@odata.nextLink'
                        $Result = (Invoke-WebRequest @InvokeWebRequestSplat).Content | ConvertFrom-Json
                        $EndResult += ConvertTo-MgaResult -Response $Result
                    }
                }
            }
            if ((-not($EndResult)) -and ($Api -eq 'All') -and ($UpdateMgaUriApi.Api -eq 'v1.0')) {
                Write-Warning 'No data found, trying again with -Api beta'
                throw $_
            }
        }
        catch {
            $StartMgaProcessCatchDefaultSplat = @{
                Uri             = $Uri
                Api             = $Api
                UpdateMgaUriApi = $UpdateMgaUriApi
                Result          = $Result
                Throw           = $_
            }
            $Uri = (Start-MgaProcessCatchDefault @StartMgaProcessCatchDefaultSplat).Uri 
            $MgaSplat = @{
                Uri = $Uri
                Api = 'Beta'
            }
            if ($SkipNextLink) {
                $MgaSplat.SkipNextLink = $true
            }
            $EndResult += Get-Mga @MgaSplat
            $ReturnVerbose = $false
        }
    }
    end {
        Complete-MgaResult -Result $EndResult -CustomHeader $CustomHeader -ReturnVerbose $ReturnVerbose -ReturnAsJson $ReturnAsJson
    }
}