@@ -74,7 +74,8 @@ function Get-AzureRMAuthorizationChangeLog {
7474
7575 # Create the output structure
7676 $out = " " | select Timestamp, Caller, Action, PrincipalId, PrincipalName, PrincipalType, Scope, ScopeName, ScopeType, RoleDefinitionId, RoleName
77- $out.Timestamp = $endEvent.EventTimestamp
77+
78+ $out.Timestamp = Get-Date - Date $endEvent.EventTimestamp - Format u
7879 $out.Caller = $_.Caller
7980 if ($_.HttpRequest.Method -ieq " PUT" ) {
8081 $out.Action = " Granted"
@@ -92,21 +93,72 @@ function Get-AzureRMAuthorizationChangeLog {
9293 }
9394
9495 if ($messageBody ) {
95-
96+ # Process principal details
9697 $out.PrincipalId = $messageBody.properties.principalId
9798 if ($out.PrincipalId -ne $null ) {
98- $principalDetails = Get-PrincipalDetails $out.PrincipalId ([REF ]$principalDetailsCache )
99+ # Get principal details by querying Graph. Cache principal details and read from cache if present
100+ $principalId = $out.PrincipalId
101+
102+ if ($principalDetailsCache.ContainsKey ($principalId )) {
103+ # Found in cache
104+ $principalDetails = $principalDetailsCache [$principalId ]
105+ } else { # not in cache
106+ $principalDetails = " " | select Name, Type
107+ $user = Get-AzureRMADUser - ObjectId $principalId
108+ if ($user ) {
109+ $principalDetails.Name = $user.DisplayName
110+ $principalDetails.Type = " User"
111+ } else {
112+ $group = Get-AzureRMADGroup - ObjectId $principalId
113+ if ($group ) {
114+ $principalDetails.Name = $group.DisplayName
115+ $principalDetails.Type = " Group"
116+ } else {
117+ $servicePrincipal = Get-AzureRMADServicePrincipal - objectId $principalId
118+ if ($servicePrincipal ) {
119+ $principalDetails.Name = $servicePrincipal.DisplayName
120+ $principalDetails.Type = " Service Principal"
121+ }
122+ }
123+ }
124+ # add principal details to cache
125+ $principalDetailsCache.Add ($principalId , $principalDetails );
126+ }
127+
99128 $out.PrincipalName = $principalDetails.Name
100129 $out.PrincipalType = $principalDetails.Type
101130 }
102131
132+ # Process scope details
103133 if ([string ]::IsNullOrEmpty($out.Scope )) { $out.Scope = $messageBody.properties.Scope }
104134 if ($out.Scope -ne $null ) {
105- $resourceDetails = Get-ResourceDetails $out.Scope
106- $out.ScopeName = $resourceDetails.Name
135+ # Remove the authorization provider details from the scope, if present
136+ if ($out.Scope.ToLower ().Contains(" /providers/microsoft.authorization" )) {
137+ $index = $out.Scope.ToLower ().IndexOf(" /providers/microsoft.authorization" )
138+ $out.Scope = $out.Scope.Substring (0 , $index )
139+ }
140+
141+ $scope = $out.Scope
142+ $resourceDetails = " " | select Name, Type
143+ $scopeParts = $scope.Split (' /' , [System.StringSplitOptions ]::RemoveEmptyEntries)
144+ $len = $scopeParts.Length
145+
146+ if ($len -gt 0 -and $len -le 2 -and $scope.ToLower ().Contains(" subscriptions" )) {
147+ $resourceDetails.Type = " Subscription"
148+ $resourceDetails.Name = $scopeParts [1 ]
149+ } elseif ($len -gt 0 -and $len -le 4 -and $scope.ToLower ().Contains(" resourcegroups" )) {
150+ $resourceDetails.Type = " Resource Group"
151+ $resourceDetails.Name = $scopeParts [3 ]
152+ } elseif ($len -ge 6 -and $scope.ToLower ().Contains(" providers" )) {
153+ $resourceDetails.Type = " Resource"
154+ $resourceDetails.Name = $scopeParts [$len -1 ]
155+ }
156+
157+ $out.ScopeName = $resourceDetails.Name
107158 $out.ScopeType = $resourceDetails.Type
108159 }
109160
161+ # Process Role definition details
110162 $out.RoleDefinitionId = $messageBody.properties.roleDefinitionId
111163 if ($out.RoleDefinitionId -ne $null ) {
112164 if ($azureRoleDefinitionCache [$out.RoleDefinitionId ]) {
@@ -124,7 +176,7 @@ function Get-AzureRMAuthorizationChangeLog {
124176 if ($_.Status -ne $null -and $_.Status -ieq " Succeeded" -and $_.OperationName -ne $null -and $_.operationName.StartsWith (" Microsoft.Authorization/ClassicAdministrators" , [System.StringComparison ]::OrdinalIgnoreCase)) {
125177
126178 $out = " " | select Timestamp, Caller, Action, PrincipalId, PrincipalName, PrincipalType, Scope, ScopeName, ScopeType, RoleDefinitionId, RoleName
127- $out.Timestamp = $_.EventTimestamp
179+ $out.Timestamp = Get-Date - Date $_.EventTimestamp - Format u
128180 $out.Caller = " Subscription Admin"
129181
130182 if ($_.operationName -ieq " Microsoft.Authorization/ClassicAdministrators/write" ){
@@ -153,60 +205,4 @@ function Get-AzureRMAuthorizationChangeLog {
153205 $output | Sort Timestamp
154206}
155207} # End commandlet
156-
157- # Helper functions
158- # Resolve a principal. If the principal's object id was encountered in the principals resolved so far, return principalDetails from the cache.
159- # Else make a Grpah call and add that principal to cache of known principals
160- function Get-PrincipalDetails ($principalId , [REF ]$principalDetailsCache )
161- {
162- if ($principalDetailsCache.Value.ContainsKey ($principalId )) {
163- return $principalDetailsCache.Value [$principalId ]
164- }
165-
166- $principalDetails = " " | select Name, Type
167- $user = Get-AzureRMADUser - ObjectId $principalId
168- if ($user ) {
169- $principalDetails.Name = $user.DisplayName
170- $principalDetails.Type = " User"
171- } else {
172- $group = Get-AzureRMADGroup - ObjectId $principalId
173- if ($group ) {
174- $principalDetails.Name = $group.DisplayName
175- $principalDetails.Type = " Group"
176- } else {
177- $servicePrincipal = Get-AzureRMADServicePrincipal - objectId $principalId
178- if ($servicePrincipal ) {
179- $principalDetails.Name = $servicePrincipal.DisplayName
180- $principalDetails.Type = " Service Principal"
181- }
182- }
183- }
184-
185- $principalDetailsCache.Value.Add ($principalId , $principalDetails );
186-
187- $principalDetails
188- }
189-
190- # Get resource details from scope
191- function Get-ResourceDetails ($scope )
192- {
193- $resourceDetails = " " | select Name, Type
194- $scopeParts = $scope.Split (' /' , [System.StringSplitOptions ]::RemoveEmptyEntries)
195- $len = $scopeParts.Length
196-
197- if ($len -gt 0 -and $len -le 2 -and $scope.ToLower ().Contains(" subscriptions" )) {
198- $resourceDetails.Type = " Subscription"
199- $resourceDetails.Name = $scopeParts [1 ]
200- }
201- elseif ($len -gt 0 -and $len -le 4 -and $scope.ToLower ().Contains(" resourcegroups" )) {
202- $resourceDetails.Type = " Resource Group"
203- $resourceDetails.Name = $scopeParts [3 ]
204- }
205- elseif ($len -ge 6 -and $scope.ToLower ().Contains(" providers" )) {
206- $resourceDetails.Type = " Resource"
207- $resourceDetails.Name = $scopeParts [$len -1 ]
208- }
209-
210- $resourceDetails
211- }
212208
0 commit comments