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

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-Transcript

CODE – 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/Planning

REFERENCES

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

Overview – SPO Intelligent Version History. Enabled for all sites PS1.

SharePoint Online (SPO) has new features to reduce storage by 30-60% for the full tenant by trimming old version history automatically.

Video reviews the feature, how it works, and how to enable for all sites. Cheers.

VIDEO

SCREENSHOTS

REFERECNCES

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

  1. Create SharePoint Online tracking list for end user self service
  2. Submit new form requesting External Sharing to be eabneld
  3. PowerShell create new Azure App Registration with API Permissions
  4. PowerShell code to read SharePoint Online tracking list
  5. Apply SPO Admin Center setting when Status=Approved
  6. 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

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

https://youtu.be/cNIbSYPTKoU

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

Return to Top ▲Return to Top ▲