Hi Guys - How to get all site owners in a SharePoint online site . I can able to fetch only one site owner but i need all the owners in the Owners group ( I dont need Admins )
# Import-Module -Name Microsoft.Online.SharePoint.PowerShell -WarningAction silentlycontinue
# Load SharePoint CSOM Assemblies
# Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
# Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
# Function to Generate a Report on all documents in a SharePoint Online Site Collection
Function Get-SPODocumentInventory($SiteURL)
{
Try {
# Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Credentials
# Get the web from the given URL and its subsites
$Web = $Ctx.web
$Ctx.Load($Web)
$Ctx.Load($Web.Lists)
$Ctx.Load($web.Webs)
$Site = $Ctx.Site
$Ctx.Load($Site)
$SiteOwner = $Site.Owner
$Ctx.Load($SiteOwner)
$Ctx.executeQuery()
###############################################
# Site Created Date column
$RootWeb=$Ctx.Web
$Ctx.Load($RootWeb)
$CreatedDate = $RootWeb.created.toShortDateString()
################################################
# Array to Skip System Lists and Libraries
$SystemLists = @("Converted Forms", "Master Page Gallery", "Customized Reports", "Form Templates", "List Template Gallery", "Theme Gallery",
"Reporting Templates", "Solution Gallery", "Style Library", "Web Part Gallery", "Site Assets", "wfpub", "Site Pages", "Images","Pages")
Write-host -f Yellow "Processing Site: $SiteURL"
# Get the site creation date
$SiteCreatedDate = $Site.Createddate
# Filter Document Libraries to Scan
$Lists = $Web.Lists | Where { $_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $false -and $SystemLists -notcontains $_.Title -and $_.ItemCount -gt 0 }
# Loop through each document library
Foreach ($List in $Lists)
{
Start-Sleep -Seconds 1 # Pause for 1 minute for each document lib
# Define CAML Query to Get List Items in batches
$Query = New-Object Microsoft.SharePoint.Client.CamlQuery
$Query.ViewXml = "
<View Scope='RecursiveAll'>
<Query>
<OrderBy><FieldRef Name='ID' Ascending='TRUE'/></OrderBy>
</Query>
<RowLimit Paged='TRUE'>$BatchSize</RowLimit>
</View>"
Write-host -f Cyan "`t Processing Document Library: '$($List.Title)' with $($List.ItemCount) Item(s)"
Do {
# Get List items
$ListItems = $List.GetItems($Query)
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()
# Filter Files
$Files = $ListItems | Where { $_.FileSystemObjectType -eq "File" }
# Iterate through each file and get data
$DocumentInventory = @()
Foreach ($Item in $Files)
{
$File = $Item.File
$Ctx.Load($File)
$Ctx.ExecuteQuery()
$DocumentData = New-Object PSObject
$DocumentData | Add-Member NoteProperty SiteName($Web.Title)
$DocumentData | Add-Member NoteProperty SiteURL($SiteURL)
$DocumentData | Add-member NoteProperty -name "SiteCreatedDate" -Value ($CreatedDate)
$DocumentData | Add-Member NoteProperty SiteOwner($Site.Owner.Email)
$DocumentData | Add-Member NoteProperty DocLibraryName($List.Title)
$DocumentData | Add-Member NoteProperty FileName($File.Name)
$DocumentData | Add-Member NoteProperty FileURL($File.ServerRelativeUrl)
$DocumentData | Add-Member NoteProperty CreatedBy($Item["Author"].Email)
$DocumentData | Add-Member NoteProperty CreatedOn($File.TimeCreated)
$DocumentData | Add-Member NoteProperty ModifiedBy($Item["Editor"].Email)
$DocumentData | Add-Member NoteProperty LastModifiedOn($File.TimeLastModified)
$DocumentData | Add-Member NoteProperty Size-KB([math]::Round($File.Length/1KB))
# Add the result to an Array
$DocumentInventory += $DocumentData
}
# Export the result to a CSV file
$DocumentInventory | Export-CSV $ReportOutput -NoTypeInformation -Append
$Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition
} While ($Query.ListItemCollectionPosition -ne $null)
}
# Iterate through each subsite of the current web and call the function recursively
ForEach ($Subweb in $Web.Webs)
{
# Call the function recursively to process all subsites underneath the current web
Get-SPODocumentInventory -SiteURL $Subweb.url
Start-Sleep -Seconds 1 # Pause for each subsite
}
}
###########################################
Catch {
$ErrorMessage = "Error Generating Document Inventory for site $SiteURL and subsite $($Subweb.url)! $_.Exception.Message"
Write-Host -f Red $ErrorMessage
# Log the error to a text file
$ErrorLogPath = "C:\temp\ErrorLog.txt"
$ErrorMessage | Out-File -FilePath $ErrorLogPath -Append # 12/1
Continue # 12/1
# Throw the error again to propagate it up the call stack
throw $_
}
}
#############################################
# Config Parameters
#$SiteCollURL = "https://contoso.sharepoint.com"
$SiteCollURL = "https://contoso.sharepoint.com/sites/devtest"
$ReportOutput = "C:\temp\sites-inv.csv"
$BatchSize = 2000
<# Setup Credentials to connect manual
$Cred = Get-Credential
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)#>
################################################################
# Setup Credentials to connect automated
$UserName="******@contoso.com"
$Password = "testingpwd123"
$SecurePassword = ConvertTo-SecureString -String $Password -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $UserName, $SecurePassword #>
#####################################################################
# Delete the Output Report, if it exists
if (Test-Path $ReportOutput) { Remove-Item $ReportOutput }
# Call the function
Get-SPODocumentInventory $SiteCollURL