1.Please refer below article to get a detailed report on usage in a site collection.
https://learn.microsoft.com/en-us/sharepoint/administration/view-usage-reports
2.You could use below PowerShell to generate a report for all activate features.
Add-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue
#Get all Farm scoped features
write-host "Farm scoped features:"
Get-SPFeature -Farm
#Process All Web Applications
ForEach ($WebApp in Get-SPWebApplication)
{
write-host "`nProcessing Web Application:" $webapp.url
#Get All Web Application Scoped features
Get-SPFeature -WebApplication $WebApp.url
#Process each site collection
foreach ($site in $WebApp.sites)
{
write-host "`tProcessing Site Collection: " $site.url
#Get All Site collection Scoped features
Get-SPFeature -Site $site.url
#Process each site
foreach ($web in $site.AllWebs)
{
write-host "`t`tProcessing Web: " $web.url
#Get All Web scoped features
Get-SPFeature -Web $web
}
}
}
3.You could use below PowerShell to generate a report for all inactive features.
Add-PSSnapin "Microsoft.SharePoint.Powershell" -ErrorAction SilentlyContinue
$InactiveFeatures = @()
#Get All installed features on respective scopes
$WebAppFeatures = Get-SPFeature | Where-Object {$_.Scope -eq "WebApplication" }
$siteFeatures = Get-SPFeature | Where-Object {$_.Scope -eq "Site" }
$WebFeatures = Get-SPFeature| Where-Object {$_.Scope -eq "Web" }
Write-host "Checking Web Application Scoped Features..."
foreach ($WebAppFeature in $WebAppFeatures)
{
$Flag = $False
foreach ($WebApp in Get-SPWebApplication)
{
if ((Get-SPFeature -WebApplication $WebApp.URL | Where-Object {$_.Id -eq $WebAppFeature.id}) -ne $null)
{
#We found that the Feature is active, Lets end up the loop
$Flag = $True
break
}
}
if($Flag -eq $False)
{
Write-Host "$($WebFeature.DisplayName) is not Active on any Web Application!)"
}
}
Write-Host "`nChecking Site Collection Scoped Features..."
foreach ($SiteFeature in $SiteFeatures)
{
$Flag = $False
:WebAppLoop1 foreach ($WebApp in Get-SPWebApplication)
{
foreach($site in $WebApp.Sites)
{
if ((Get-SPFeature -Site $Site.URL | Where-Object {$_.Id -eq $SiteFeature.id}) -ne $null)
{
#We found that the Feature is active, Lets end up the loop
$Flag = $True
break WebAppLoop1
}
}
}
if($Flag -eq $False)
{
Write-Host "$($SiteFeature.DisplayName) is not Active on Any Site Collection!"
}
}
Write-host "`nChecking Web Scoped Feature..."
foreach ($WebFeature in $WebFeatures)
{
$Flag = $False
#I'm limiting to a single web application, Remove ""https://sharepoint.crescent.com" to process all WebApps
:WebAppLoop2 foreach ($WebApp in Get-SPWebApplication "https://sharepoint.crescent.com")
{
foreach($Site in $WebApp.Sites)
{
foreach($Web in $Site.AllWebs)
{
if ((Get-SPFeature -Web $Web.URL | Where-Object {$_.Id -eq $WebFeature.id}) -ne $null)
{
#We found that the Feature is active, Lets end up the loop
$Flag = $True
break WebAppLoop2
}
}
}
}
if($Flag -eq $False)
{
Write-Host "$($WebFeature.DisplayName) is not Active on Any Web!"
}
}
If the answer is helpful, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.