Find All Lists And Libraries Using InfoPath forms In SharePoint Online using PowerShell script via API

 This script can identify all the lists and form libraries that use InfoPath forms and it generate excel report with detailed information as well.

This script developed for get InfoPath form details from single site collection only, if you want get detail from multiple site collections or from tenant level, then you have modify the script to loop through all site collections.

Note: we are not fetching simply all form library using base template 115, along with we are checking whether form library associated with InfoPath forms or not, and same logic has been applied for generic list (base template 100) to identify associated InfoPath forms.

Note: Please check my previous post how to generate API secrets, then you will understand how PowerShell script is authenticating even though your tenant had multifactor authentication or without admin credentials.

#Load assemblies
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
[System.Reflection.Assembly]::LoadWithPartialName("OfficeDevPnP.Core.dll")
clear-host


#Encrypted Graph API
$EClientID = "XXXXXXXXXXXXXXXXXXXXXXX"
$ETenantID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
$EThubprintID = "XXXXXXXXXXXXXXXx"


#Decrypted function
Function Decode ($guid){
$ID1 = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($guid))
return $ID1
}


#Function to Get Form Libraries-Lists
Function Get-PnPFormLibraries-Lists
{
    [cmdletbinding()]
    param(
    [parameter(Mandatory = $true, ValueFromPipeline = $True)]$Web,
    [parameter(Mandatory = $true, ValueFromPipeline = $False)][String] $CSVPath
    )
   
    Try {
         
        #Get Current Context
        $pnpcontext = Get-PnPContext

        #Get All Lists with InfoPath Forms
        $i=0;
        foreach ($List in ($Lits = Get-PnPList -Web $Web))
        {
      
            #Please use ($List.BaseTemplate -eq 100) for checking only Generic lists
            if($List.BaseTemplate -eq 100)
            #if($List.BaseTemplate -ne 101)
            {
                $pnpcontext.Load($List.ContentTypes)
                $pnpcontext.ExecuteQuery()


                if ($List.ContentTypes[0].EditFormUrl.Contains("editifs.aspx"))
                {
                    #$LastItemCreated = ((Get-PnPListItem -List $List | select -Last 1).FieldValues.Created).tostring("m/d/yyyy h:mm")          
                    $List | Select Title, DefaultViewUrl, BaseType, BaseTemplate, Created, @{label='LastItemCreated';expression={((Get-PnPListItem -List $_.Title | select -Last 1).FieldValues.Created).tostring("M/d/yyyy h:mm")}} | Export-Csv -Path $CSVPath -NoTypeInformation -Append
                                   
                    $i++;
                }
            }

        }
   
        #Get All Form libraries
        $FormLibraries = Get-PnPList -Web $Web | Where-Object {$_.BaseTemplate -eq 115 -and $_.Hidden -eq $false -and $_.DocumentTemplateUrl.ToString().EndsWith("xsn") -eq $true }
 
        #Export Form Libraries Inventory to CSV
        If($FormLibraries.count -gt 0)
        {
            Write-host "Identified Web '$($Web.URL)'" -f Yellow
            Write-host "`tFound '$($FormLibraries.count)' Form Librarie(s)!" -f Green
            $FormLibraries | Select Title, DefaultViewUrl, BaseType, BaseTemplate, Created, @{label='LastItemCreated';expression={((Get-PnPListItem -List $_.Title | select -Last 1).FieldValues.Created).tostring("M/d/yyyy h:mm")}} | Export-Csv -Path $CSVPath -NoTypeInformation -Append
            
            if($i -ne 0) {
            Write-host "`tFound '$($i)' InfoPath List(s)!" -f Green }
        }else{

            if($i -ne 0) {
            Write-host "Identified Web '$($Web.URL)'" -f Yellow
            Write-host "`tFound '$($i)' InfoPath List(s)!" -f Green }

        }

        #Get All Subwebs
        $SubWebs = Get-PnPSubWebs -web $Web
        Foreach ($SubWeb in $SubWebs)
        {
            #Connect to PnP Online for subweb
            Connect-PnPOnline -Url $SubWeb.Url -ClientId $(Decode $EClientID) -Tenant $(Decode $ETenantID) -Thumbprint $(Decode $EThubprintID)
            
            #Call the function recursively
            Get-PnPFormLibraries-Lists -Web $SubWeb -CSVPath $CSVPath
        }
    }
    catch {
        write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
    }
}


#Set Variables
$Web = Read-Host -Prompt "Enter Site Collection URL" 
$CSVPath = "C:\InfoPathFormDetails.csv"


#Delete the Output Report if exists
If (Test-Path $CSVPath) { Remove-Item $CSVPath }


#Connect to PnP Online
Connect-PnPOnline -Url $Web -ClientId $(Decode $EClientID) -Tenant $(Decode $ETenantID) -Thumbprint $(Decode $EThubprintID)
$Web = Get-PnPWeb


#Call the function
Get-PnPFormLibraries-Lists -Web $Web -CSVPath $CSVPath

#Importnant: Delete the variables and its value from memory
Get-Variable | ForEach-Object { Remove-Variable -Name $_.Name -Force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue}

Execute above script and enter site collection address then you may see below out put.

No alt text provided for this image

It also generate detailed information regarding InfoPath form library or list details along with last item created info which helps whether the library/list has been actively using or not using in tenant.

No alt text provided for this image

Thanks for visiting blog.

Comments