CTGlobal.PimAdmin.psm1
Function Get-PimAzureResource { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $azureResourceId ) #Find pim resource from externalId (ARM ResourceId) <#Debug $roleDisplayName = "Contributor" $azureResourceId = $($rg.resourceId) #> $uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/resources?`$filter=externalId eq '$azureResourceId'" $pimResource = $null $pimResource = (Invoke-GraphRequest -url $uri -Token $Token -Method Get).value if ($null -eq $pimResource) { throw "Pim resource not found on url: $uri" } if ($null -ne $pimResource -and $pimResource.Count -gt 1) { throw "More than Pim resource found on url: $uri" } return $pimResource[0] } Function Get-PimAzureResourceRoleDefinition { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $pimResourceId, [Parameter(Mandatory = $true)] $roleDisplayName ) <#Debug $roleDisplayName = "Contributor" #> #Find Pim Role $uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/roleDefinitions?`$filter=resourceId+eq+'$pimResourceId'+and+displayName+eq+'$roleDisplayName'"; #$uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/$pimResourceId/roleDefinitions"; $pimRoleDefinition = $null $pimRoleDefinition = (Invoke-GraphRequest -url $uri -Token $Token -Method Get).value if ($null -eq $pimRoleDefinition) { throw "Role definition not found on url : $uri" } if ($null -ne $pimRoleDefinition -and $pimRoleDefinition.Count -gt 1) { throw "More than one role defintion found on url: $uri" } return $pimRoleDefinition[0] } #Function Get-PimResource { Function Get-PimAzureResourceRoleSetting { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $pimResourceId, [Parameter(Mandatory = $true)] $pimRoleDefinitionId ) #Set pim settings on RG $uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/resources/$pimResourceId/roleSettings" #'+and+roleDefinitionId+eq+'$pimRoleDefinitionId'" $uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/roleSettings?`$filter=resourceId+eq+'$pimResourceId'+and+roleDefinitionId+eq+'$pimRoleDefinitionId'" $pimGovernanceRoleSetting = $null $pimGovernanceRoleSetting = (Invoke-GraphRequest -url $uri -Token $Token -Method Get).value #$pimGovernanceRoleSettings.Where({$_.roleDefinitionId -eq $pimRoleDefinitionId }) #$pimGovernanceRoleSettings | ogv if ($null -eq $pimGovernanceRoleSetting) { throw "Pim Settings not found on url: $uri" } if ($null -ne $pimGovernanceRoleSetting -and $pimGovernanceRoleSetting.Count -gt 1) { throw "More than one setting found. Cannot continue. $pimGovernanceRoleSetting" } return $pimGovernanceRoleSetting[0] } #Function Get-PimResourceSettings { Function Set-PimAzureResourceRoleSetting { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $pimGovernanceRoleSetting ) $pimGovernanceRoleSettingId = $pimGovernanceRoleSetting.id #Save Settings $body = $pimGovernanceRoleSetting | ConvertTo-Json $Uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/roleSettings/$pimGovernanceRoleSettingId" Invoke-GraphRequest -url $uri -Token $Token -Method Patch -Body $Body } Function New-PimAzureResourceRoleAssignment { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $userId, [Parameter(Mandatory = $true)] $pimResourceId, [Parameter(Mandatory = $true)] $RoleDefinitionId, [Parameter(Mandatory = $true)] $reason, $startDateTime = [System.DateTime]$(Get-Date).AddMinutes(2), #from Now $endDateTime = $null, $type = "Once" ) #make eligeble #https://docs.microsoft.com/en-us/graph/api/privilegedroleassignment-makeeligible?view=graph-rest-beta&tabs=cs $roleAssignment = @{ roleDefinitionId = $pimRoleDefinitionId resourceId = $pimResourceId subjectId = $userId assignmentState = "Eligible" type = "AdminAdd" reason = $reason #"Added via SharePoint Form" #Todo add sharepoint list or other info. schedule = @{ startDateTime = $startDateTime endDateTime = $endDateTime type = $type } } $body = $roleAssignment | ConvertTo-Json $Uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/roleAssignmentRequests" Invoke-GraphRequest -url $uri -Token $Token -Method Post -Body $Body } Function Get-PimAzureResourceRoleAssignment { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $pimResourceId ) #get current assignments $Uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/resources/$($pimResourceId)/roleAssignments" $rgRoleAssignments = (Invoke-GraphRequest -url $Uri -Token $Token -Method Get).value return $rgRoleAssignments; } Function Get-PimAzureResourceRoleAssignmentRequest { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $pimResourceId ) #get current assignments $Uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/resources/$($pimResourceId)/roleAssignmentRequests" $rgRoleAssignmentRequests = (Invoke-GraphRequest -url $Uri -Token $Token -Method Get).value return $rgRoleAssignmentRequests; } Function Remove-PimAzureResourceRoleAssignment { param( [Parameter(Mandatory = $true)] $Token, [Parameter(Mandatory = $true)] $pimResourceRoleAssignmentRequest ) #Cancel if in progress, AdminRemove if granted if($pimResourceRoleAssignmentRequest.status.status -eq "InProgress"){ $pimResourceRoleAssignmentRequestId = $pimResourceRoleAssignmentRequest.Id $Uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/roleAssignmentRequests/$pimResourceRoleAssignmentRequestId/cancel" } else { $pimResourceRoleAssignmentRequest.type = "AdminRemove" $Body = $pimResourceRoleAssignmentRequest | ConvertTo-Json -Depth 100 $Uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/roleAssignmentRequests" } #$Uri = "https://graph.microsoft.com/beta/privilegedAccess/azureResources/resources/$($pimResourceId)/roleAssignments" (Invoke-GraphRequest -url $Uri -Token $Token -Method POST -Body $Body).value return $rgRoleAssignments; } |