Get SharePoint List Flow Details using PowerShell

Get SharePoint List Flow Details using PowerShell

Power Automate Flows created against SharePoint Online lists/libraries get stored in the same default environment as all other flows. This can lead to confusion and frustration in cases where you need to know which ones are SharePoint-related and which are not. Fortunately, there’s an easy way to find those using PowerShell!

Requirements

  • PowerShell 3.x or higher (launched as Administrator if you need the below module)
  • Install-Module Microsoft.PowerApps.Administration.PowerShell

Script

$tenantID='your-tenant-id'
Add-PowerAppsAccount -TenantID $tenantID
$e = Get-AdminPowerAppEnvironment
$results = @()
################################ FLOWS ################################
$flows = Get-AdminFlow -EnvironmentName $($e.EnvironmentName)
foreach($f in $flows){
    $ff = Get-AdminFlow -EnvironmentName $($e.EnvironmentName) -FlowName $f.FlowName
    $isSP = $false
    $siteUrl = ""
    $listId = ""
    foreach($r in $ff.Internal.properties.referencedResources){
        if($r.service -eq "sharepoint" -and $r.resource.list -ne $null){
            $isSP = $true;
            $siteUrl = $($r.resource.site)
            $listId = $($r.resource.list)
            break;
        }
    }
    $arrDate = $($f.CreatedTime -split 'T')
    $arrTime = $($arrCreatedDate[1].Substring(0,8))
    $arrLMDate = $($f.LastModifiedTime -split 'T')
    $arrLMTime = $($arrLMDate[1].Substring(0,8))
    if($ff.Internal.properties.connectionReferences -ne $null){
        $conns = $ff.Internal.properties.connectionReferences | Get-Member -MemberType NoteProperty
        foreach($cr in $conns){
            $rawdata = $($cr.Definition -split "=@{")[1]
            $propdata = ConvertFrom-String $rawdata
            $connectorId = if([datetime]$ff.CreatedTime -ge [datetime]"06/08/2023 00:00") { $($propdata.P3) } else { $($propdata.P4) }
            $connectorDisplayName = if([datetime]$ff.CreatedTime -ge [datetime]"06/08/2023 00:00") { if($($propdata.P4) -match "=") { $($($propdata.P4 -split '=')[1].Trim(';')) } else { $($propdata.P4) } } else {  if($($propdata.P5) -match "=") { $($($propdata.P5 -split '=')[1].Trim(';')) } else { $($propdata.P5) } }
            $flow = [PSCustomObject]@{
                Environment=$e.DisplayName
                FlowName=$ff.FlowName
                FlowDisplayName=$ff.DisplayName
                OwnerId=$ff.CreatedBy.objectId
                Created=$([datetime]::parseexact($arrDate[0] + " " + $arrTime, 'yyyy-MM-dd HH:mm:ss', $null))
                Modified=$([datetime]::parseexact($arrLMDate[0] + " " + $arrLMTime, 'yyyy-MM-dd HH:mm:ss', $null))
                ConnectorName=$connectorDisplayName
                ConnectorId=$connectorId
                Site=$siteUrl
                ListId=$listId
            }
            $results += $flow 
        }
    }
}
$results | ogv
Comments are closed.