Site Icon – Update 3 settings to cover all Modern and Classic templates
With both Modern UI and Classic UI page support in SharePoint Online (SPO) we have multiple settings to control the simple site icon.
From Site Contents > Site Settings > Title, Description, Icon we will upload image file and infludnece only Classic ASPX page display.
From homepage > Gear Icon > Change the Look > Site Header, we will upload image file twice and influece only Modern ASPX page dipslay.
Recorded quick demo to show both step-by-step for consistent navigation as end users flip between both display modes. Cheers
VIDEO
SCREENSHOTS


REFERENCES
- https://techcommunity.microsoft.com/discussions/sharepoint_general/changing-modern-site-icons/43591
- https://support.microsoft.com/en-au/office/change-a-site-s-title-description-logo-and-site-information-settings-8376034d-d0c7-446e-9178-6ab51c58df42
- https://support.microsoft.com/en-us/office/change-the-look-of-your-sharepoint-site-06bbadc3-6b04-4a60-9d14-894f6a170818
Disable SPO Modern Comments with PowerShell automation
Step by step demo how to Disable SPO Modern Comments with PowerShell automation. Useful for scenario where Communication site or Publishing portal has well moderated text and goal is to avoid user comments added by anyone on page footer. NOTE – Comments are DELETED when the disable executes. Attempts to re-enable comments again will show a blank thread (prior text comments not visible).
Cheers

VIDEO
CODE
# Load PnP PowerShell Module
#Install-Module "PnP.PowerShell" -MaxVersion 1.13 -Scope CurrentUser
Import-Module "PnP.PowerShell"
# Register the app for interactive login with Azure Application Registration
Register-PnPEntraIDAppForInteractiveLogin -Tenant "spjeffdev.onmicrosoft.com" -ApplicationName "PnP Shell"
# Target SharePoint site URL
$url = "https://spjeffdev.sharepoint.com/sites/Communication"
$clientId = "a31e1734-a19e-43d4-9b37-88cf71f67610" # Replace with your registered app's client ID
# Connect to SharePoint Online site
Connect-PnPOnline -Url $url -Interactive -ClientId $clientId
# Get the current web to display Title and URL
Get-PnPWeb
# Disable modern comments for each Site Pages library
$pages = Get-PnPClientSidePage | Where-Object { $_.Name -like "*.aspx" }
$pages | Format-Table Name, CommentsEnabled -AutoSize
foreach ($page in $pages) {
Write-Host "Disabling comments on page: $($page.Name)"
Set-PnPClientSidePage -Identity $page.Name -CommentsEnabled:$false
}SCREENSHOT


REFERENCES
Create SharePoint SPO Navigation links with PowerShell and CSV for Top Navigation and Quick Launch
Step by step demo how to populate the Top Navigation bar with PowerShell PS1 and CSV automation. Attention given to parent > child relationship and how links are nested for compatibility to many branding scenarios. Also supports both QuickLaunch (left) and TopNavigation (top) placement. Cheers
VIDEO
CODE – PS1
function Main() {
# Load PnP PowerShell Module
#Install-Module "PnP.PowerShell" -MaxVersion 1.13 -Scope CurrentUser
Import-Module "PnP.PowerShell"
# Target SharePoint site URL
$tenant = "https://test.sharepoint.com"
$url = "https://spjeffdev.sharepoint.com/sites/Communication"
$location = "QuickLaunch"
# Connect to SharePoint Online site
Connect-PnPOnline -Url $url -UseWebLogin
# Get the current web to display Title and URL
Get-PnPWeb
# Read current top navigation
$topNav = Get-PnPNavigationNode -Location $location
Write-Host "Current Top Navigation Links:"
foreach ($node in $topNav) {
Write-Host "- $($node.Title): $($node.Url)"
}
# Read CSV with schema (ID,Parent,Title,URL) of desired top navigation links including primary key ID and ParentID for parent-child relationships
$csvPath = ".\Fill-Top-Nav.csv"
$topNavLinks = Import-Csv -Path $csvPath
# Create top navigation links (if missing) from CSV
foreach ($link in $topNavLinks) {
$existingLink = Get-PnPNavigationNode -Location $location | Where-Object { $_.Title -eq $link.Title }
if (-not $existingLink) {
Write-Host "Adding top navigation link: $($link.Title)"
# For parent-child relationships, find the parent node by ParentID
if ($link.ParentID -ne 0) {
$parentLink = $topNavLinks | Where-Object { $_.ID -eq $link.ParentID }
$parentNode = Get-PnPNavigationNode -Location $location | Where-Object { $_.Title -eq $parentLink.Title }
if ($parentNode) {
# SCENARIO 1 - Create with Parent
$url = $tenant + $link.URL +"/"
Write-Host $url -Fore Yellow
Add-PnPNavigationNode -Title $link.Title -Url $url -Location $location -Parent $parentNode.Id
Write-Host "Link created [$($link.Title)] under parent [$($parentLink.Title)]" -ForegroundColor "Green"
}
else {
Write-Host "Parent not found for [$($link.Title)]" -ForegroundColor "Yellow"
}
}
else {
# SCENARIO 2 - Create without Parent
$url = $tenant + $link.URL +"/"
Write-Host $url -Fore Yellow
Add-PnPNavigationNode -Title $link.Title -Url $url -Location $location
}
}
else {
Write-Host "Link already exists [$($link.Title)]" -ForegroundColor "Green"
}
}
}
# Open Log
$prefix = $MyInvocation.MyCommand.Name
$host.UI.RawUI.WindowTitle = $prefix
$stamp = Get-Date -UFormat "%Y-%m-%d-%H-%M-%S"
Start-Transcript "$PSScriptRoot\log\$prefix-$stamp.log"
$start = Get-Date
# Run Main
Main
# Close Log
$end = Get-Date
$totaltime = $end - $start
Write-Host "`nTime Elapsed: $($totaltime.tostring("hh\:mm\:ss"))"
Stop-TranscriptCODE – CSV
ID,ParentID,Title,URL
1,0,Business Services,/sites/Communication/Business Services
2,1,Business Services Forms,/sites/Communication/Business Services/BusinessServices-Forms
3,0,Communications,/sites/Communication/Communications
4,3,Placeholder,/sites/Communication/Communications/Placeholder
5,0,Resources,/sites/Communication/Resources
6,5,Records,/sites/Communication/Records
7,0,Director Office,/sites/Communication/DirectorOffice
8,7,Placeholder,/sites/Communication/DirectorsOffice/PH
11,0,Finance,/sites/Communication/Finance
12,0,Operations and Planning,/sites/Communication/OperationsPlanning
13,0,Health,/sites/Communication/Health
13,0,Inventory,/sites/Communication/Inventory
14,0,Planning,/sites/Communication/PlanningREFERENCES
Jailbreak Allow Custom Script Forever (Goodbye 24 Hour Auto Reset)
Step by step demo how to use scheduled MS Flow to enable [X] Allow Custom Script for SharePoint Online (SPO) site collections. No need for PowerShell or manual button clicks anymore. Cheers.

VIDEO
REFERENCES
- https://www.sharepointdiary.com/2017/12/how-to-enable-custom-script-in-sharepoint-online.html
- https://learn.microsoft.com/en-us/sharepoint/allow-or-prevent-custom-script
- https://www.reddit.com/r/sharepoint/comments/1eb3e4o/thoughts_on_allow_custom_scripts_in_sp_sites/
- https://sharepoint.stackexchange.com/questions/312375/how-can-i-use-pnp-powershell-to-enable-custom-script-in-a-subsite
- https://support.shortpoint.com/support/solutions/articles/1000253824-enable-scripting-capabilities-with-powershell-for-microsoft-365
Overview – SPO Intelligent Version History. Enabled for all sites PS1.
FIXED Menu missing Export MS Flow to ZIP. Two methods – Export and Solution ZIP. Backup always even when menu missing.
Demo step by step how to backup and export PowerAutomate (MS Flow) to ZIP file. With legacy MS Flow we are given native menu “Export > Package (.zip)” direct on native menus. However, that native menu is missing our options for backup are not as obvious.
With Solutions, we can always backup to ZIP.
Creating a new Solution allows to add Existing Objects > Cloud Flows where we can select anything in the local Environment for easy backup offline to ZIP file.
With PowerApps Canvas we have Version History for rollback to past development. With PowerAutomate (MS Flow) manual backups give a more intention development process provide a safety net as we deploy new features and releases. Cheers.

VIDEO
SCREENSHOTS




REFERENCE
SPO Admin Center – Delegate External Sharing Setting with Workflow and PowerShell PS1
Demo showing step by step how to
- Create SharePoint Online tracking list for end user self service
- Submit new form requesting External Sharing to be eabneld
- PowerShell create new Azure App Registration with API Permissions
- PowerShell code to read SharePoint Online tracking list
- Apply SPO Admin Center setting when Status=Approved
- Full audit trail for compliance with Version History, time stamp, and end user action
Enjoy and please leave a video comment with ideas on how to improve. Thank you.

VIDEO
SOURCE CODE
REFERENCES
- https://pnp.github.io/powershell/cmdlets/Register-PnPAzureADApp.html
- https://learn.microsoft.com/en-us/sharepoint/external-sharing-overview
- https://pnp.github.io/powershell/cmdlets/Set-PnPTenantSite.html
SCREENSHOTS




Set Targeted Audience webpart with 3 Groups types (M365/SharePoint/Entra Azure AD)
Step by step demo covering how to apply targeted audience to web part with each of the 3 “Group” types in M365. The API call behind targeted audience relies upon current Entra (Azure AD) user group membership and looks at Entra (Azure AD) which gives support combinations below:
1) M365 Group – Supported OK
2) Entra (Azure AD) – Supported OK
3) SharePoint Group (Site Collection) – Not supported
Video shows each type of group and how to apply for web part targeted audience filtering. Cheers.

VIDEO
REFERENCES
Clean SPO Sharing Links – PowerShell PNP report CSV and auto remove
Wanted to demo how to report on SharePoint Online (SPO) Sharing Links across the full M365 Tenant. PowerShell script below will:
- Register Entra App ID with PFX certificate for automation
- Loop all SharePoint sites on the tenant.
- Find all Sharing Links
- Exclude system lists for CSV quality
- Generated detailed CSV report
- Automatically revoke and remove Sharing Links
- Improve security posture and compliance
- Reduce tenant risk and support tickets
Detailed video shows step by step how to run script and then use to clean tenant settings. Cheers.

VIDEO
POWERSHELL CODE
SCREENSHOTS




REFERENCES








