@@ -150,6 +150,59 @@ function Get-AzDevOpsProject {
150150}
151151# End of Function Get-AzDevOpsProject
152152
153+ <#
154+ . SYNOPSIS
155+ Get all Azure DevOps Project Acls
156+
157+ . DESCRIPTION
158+ Get all Azure DevOps Project Acls using Azure DevOps Rest API
159+
160+ . PARAMETER ProjectId
161+ Project Id for Azure DevOps
162+
163+ . EXAMPLE
164+ Get-AzDevOpsProjectAcls -ProjectId $ProjectId
165+ #>
166+ function Get-AzDevOpsProjectAcls {
167+ [CmdletBinding ()]
168+ param (
169+ [Parameter (Mandatory )]
170+ [string ]
171+ $ProjectId
172+ )
173+ if ($null -eq $script :connection ) {
174+ throw " Not connected to Azure DevOps. Run Connect-AzDevOps first"
175+ }
176+ $Organization = $script :connection.Organization
177+ $header = $script :connection.GetHeader ()
178+ $aclInfo = @ {
179+ ' Environments' = " https://dev.azure.com/$Organization /_apis/accesscontrollists/83d4c2e6-e57d-4d6e-892b-b87222b7ad20?api-version=7.2-preview.1&token=Environments/$ProjectId "
180+ ' Pipelines' = " https://dev.azure.com/$Organization /_apis/accesscontrollists/33344d9c-fc72-4d6f-aba5-fa317101a7e9?api-version=7.2-preview.1&token=$ProjectId "
181+ ' ReleaseDefinitions' = " https://dev.azure.com/$Organization /_apis/accesscontrollists/c788c23e-1b46-4162-8f5e-d7585343b5de?api-version=7.2-preview.1&token=$ProjectId "
182+ ' Repositories' = " https://dev.azure.com/$Organization /_apis/accesscontrollists/2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87?api-version=7.2-preview.1&token=repoV2/$ProjectId "
183+ ' ServiceConnections' = " https://dev.azure.com/$Organization /_apis/accesscontrollists/49b48001-ca20-4adc-8111-5b60c903a50c?api-version=7.2-preview.1&token=endpoints/$ProjectId "
184+ ' VariableGroups' = " https://dev.azure.com/$Organization /_apis/accesscontrollists/b7e84409-6553-448a-bbb2-af228e07cbeb?api-version=7.2-preview.1&token=Library/$ProjectId "
185+ }
186+ $acls = @ {}
187+ try {
188+ # Walk through the aclInfo hashtable and get the acls for each resource
189+ foreach ($key in $aclInfo.Keys ) {
190+ $aclUri = $aclInfo [$key ]
191+ Write-Verbose " Getting $key ACLs for project $ProjectId "
192+ $aclResponse = Invoke-RestMethod - Uri $aclUri - Method Get - Headers $header
193+ # If the response is not an object but a string, the authentication failed
194+ if ($aclResponse -is [string ] -or $null -eq $aclResponse.value ) {
195+ throw " Authentication failed or project not found"
196+ }
197+ $acls.Add ($key , $aclResponse.value )
198+ }
199+ }
200+ catch {
201+ throw $_.Exception.Message
202+ }
203+ return $acls
204+ }
205+
153206<#
154207 . SYNOPSIS
155208 Export the Azure DevOps Project
@@ -196,6 +249,10 @@ function Export-AzDevOpsProject {
196249 $response = Get-AzDevOpsProject - Project $Project
197250 $response | Add-Member - MemberType NoteProperty - Name ObjectType - Value " Azure.DevOps.Project"
198251 $response | Add-Member - MemberType NoteProperty - Name ObjectName - Value " $Organization .$Project "
252+ # Add the Project Acls to the response object
253+ $acls = Get-AzDevOpsProjectAcls - ProjectId $response.id
254+ $response | Add-Member - MemberType NoteProperty - Name ProjectAcls - Value $acls
255+ # Add a new id field to the response object
199256 $response.id = @ {
200257 originalId = $response.id ;
201258 resourceName = $response.name ;
@@ -204,13 +261,13 @@ function Export-AzDevOpsProject {
204261 } | ConvertTo-Json - Depth 100
205262 }
206263 catch {
207- throw " Failed to get project $Project from Azure DevOps "
264+ throw $_ .Exception.Message
208265 }
209266 if ($PassThru ) {
210267 Write-Output $response
211268 } else {
212269 Write-Verbose " Exporting project $Project as file $Project .prj.ado.json"
213- $response | ConvertTo-Json | Out-File - FilePath " $OutputPath /$Project .prj.ado.json"
270+ $response | ConvertTo-Json - Depth 100 | Out-File - FilePath " $OutputPath /$Project .prj.ado.json"
214271 }
215272}
216273# End of Function Export-AzDevOpsProject
0 commit comments