I love it:
Author Archives: Vlad Software Engineer
Yammer API with PowerShell: Private groups and messages
Update: Private content mode will stop working on June 30, 2025.
Microsoft announced Private content mode retirement in Microsoft Viva Engage (Yammer).
Message ID MC1045211.
As an Office 365 administrator, I would like to get some reports on Yammer with PowerShell. How it’s done?
Patrick Lamber wrote a good article here: “Access the Yammer REST API through PowerShell“. The only I would add (important!) is:
By default, even with a Verified Admin token, you do not have access to private messages and private groups content.
To get private stuff, you need select “Private Content Mode” under Yammer Admin Center -> Content and Security -> Content Mode:

Check Microsoft: “Monitor private content in Yammer” and
Yammer: “Verified Admin Private Content Mode“
If you do not have “Private Content Mode” set up, you might see some weird “Invoke-WebRequest” errors like:

VSCode, PowerShell, .Net and GitHub hints
Dotnet (.net core, .net 5) useful commands:
dotnet --info dotnet new sln dotnet new webapi -o API dotnet sln add APi dotnet watch run dotnet dev-certs https --trust dotnet new gitignore
Visual Studio Code setup:
Some useful plug-ins:
- PowerShell from Microsoft
- GitHub pull requests and issues from GitHub
- C# from Microsoft
(+ ^P assets) - C# Extensions from JosKreativ
- Material Icon Theme from Philipp Kief
- Bracket Pair Colorizer 2
VS Code basic configuration:
– AutoSave
– Font Size
– Hide folders: Settings->Exclude “**/obj” “**/bin”
– Compact folders: Settings->”Compact folders”
– appsettings.Development.json: “Microsoft”: “Warning” -> “Microsoft”: “Information”
– launchSettings.json:
“launchBrowser”: true/false,
“launchUrl”
Git basic commands:
git init
create gitignore (dotnet new gitignore)
add appsettings.json to gitignore
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/orgName/AppName.git
git push -u origin main
git config --global credential.helper wincred
git config --global user.name "<John Doe>"
git config --global user.email <johndoe@example.com>
PnP.PowerShell Batches and PowerShell 7 Parallel
Parallelism
Can I use PowerShell 7 “-Parallel” option against SharePoint list items with PnP.PowerShell? Can I run something like:
$items | ForEach-Object -Parallel {
$listItem = Set-PnPListItem -List "LargeList" -Identity $_ -Values @{"Number" = $(Get-Random -Minimum 100 -Maximum 200 ) }
}
Yes, sure… But! Since it’s a cloud operation against Microsoft 365 – you will be throttled if you start more than 2 parallel threads! Using just 2 threads does not provide significant performance improvements.
Batching
So, try PnP.PowerShell batches instead. When you use batching, number of requests to the server are much lower. Consider something like:
$batch = New-PnPBatch
1..100 | ForEach-Object{ Add-PnPListItem -List "ItemTest" -Values @{"Title"="Test Item Batched $_"} -Batch $batch }
Invoke-PnPBatch -Batch $batch
Measurements
Adding and setting 100 items with “Add-PnPListItem” and “Set-PnPListItem” in a large (more than 5000 items ) SharePoint list measurements:
| Add-PnPListItem Time per item, seconds | Set-PnPListItem Time per item, seconds | |
| Regular, without batching | 1.26 | 1.55 |
| Using batches (New-PnPBatch) | 0.10 | 0.80 |
| Using “Parallel” option, with ThrottleLimit 2 | 0.69 | 0.79 |
| Using “Parallel” option, with ThrottleLimit 3 | 0.44 (fails level: ~4/100) | 0.53 (fails level: ~3/100) |
Adding items with PnP.PowerShell batching is much faster than without batching.
More:
Long-running PowerShell Office 365 reports
(WIP)
PowerShell is our best friend when it comes to ad-hoc and/or scheduled reports in Microsoft 365. PnP team is doing great job providing more and more functionality with PnP PowerShell module for Office 365 SharePoint and Teams.
Small and medium business organizations are mostly good, but for large companies it might be a problem due to just huge amount of data stored in SharePoint. PowerShell reports on all users or all sites might run days… which is probably OK if you run this report once, but totally not acceptable if you need this report e.g. daily/weekly or on-demand.
How can we make heavy PowerShell scripts run faster?
Of course, you start with logic (algorithm) and leveraging full PowerShell functionality (e.g. PowerShell 7 parallelism or PnP batching).
(examples)
What if you did everything, but it still takes too long? You need something like brute force – the closer your code runs to your tenant – the better.
What are the option?
– Automation account runbook (+workflow)
– Azure Function Apps
– Azure VM in the region closest to your Tenant
Automation account runbook (+workflow)
Seemed like a good option, but not something Microsoft promotes. Even opposite – automation accounts support only PowerShell 5 (not 7), no plug-ins for VS Code and recently there were messages on some retirement or smth.
Meantime, I tested it – and did not find any significant increasing in speed. In a nutshell, what is behind this service? Same windows machines running somewhere in Azure .
TBC
References
– PnP PowerShell
Exact Location of your SharePoint Online Microsoft Office 365 tenant
Quick answer: spin-up a few VMs in different Azure regions, then ping your SharePoint tenant. The moment you see 1ms ping you know the tenant exact location.
Full story
Microsoft says: “Customers should view tenant specific data location information in your Microsoft 365 Admin Center in Settings | Org settings | Organization Profile | Data location.”
And it might look like:

That’s accurate to the geography (e.g. US, UE, AP), but not to the region (for instance – “Central US”, “UK West” or “Australia Southeast”).
In other words, If you know your data are in the US, you do not know where exactly – East/West/Central or South US.
Meantime when you create an Azure resource (e.g. Virtual Machine) – you can select specific region.
How do I know – where is my Microsoft 365 tenant actually located?
Can we just ping the tenant, analyze result and find Office 365 tenant region?
Luckily, SharePoint tenant is pinging with just
PS>ping tenantName.SharePoint.com
I have tested 5 regions and 4 different tenants:
| ping from/to (ms) | tenant 1 (US) | tenant 2 (EU) | tenant 3 (US) | tenant 4 (US) |
| North Europe | 73 | 17 | 96 | 101 |
| East US | 1 | 83 | 39 | 31 |
| Central US | 22 | 114 | 23 | 23 |
| West US | 63 | 146 | 36 | 33 |
| South Central US | 31 | 112 | 1 | 1 |
So I figured it out:
My o365 tenants #3 and #4 regions are South Central US (Texas, San Antonio),
tenant #1 resides in East US.
Why do I need this?
Imagine you are running heavy reports against your tenant.
So probably you want your code running as close as possible to your tenant.
For this, you can spin-up a VM in Azure or use Azure Functions – just select proper region 🙂
(please check also “Long-running PowerShell reports optimization in Office 365“)
References:
– Where your Microsoft 365 customer data is stored
Beautiful Christmas at Centennial Lakes




SPO: Allow users to create modern pages
Microsoft: “Using modern pages in Microsoft SharePoint is a great way to share ideas using images, Office files, video, and more. Users can Add a page to a site quickly and easily, and modern pages look great on any device.
If you’re a global or SharePoint admin in Microsoft 365, you can allow or prevent users from creating modern pages. You can do this at the organization level by changing settings in the SharePoint admin center. If you allow the creation of site pages as the organization level, site owners can turn it on or off at the site level.“
By default both
– Allow users to create new modern pages
– Allow commenting on modern pages
are turned on (enabled)
Tenant or SharePoint admin can find settings under
SharePoint Admin Center -> Settings -> Pages

How it looks like:

Site Pages are created under “Pages” Library.
Let us test it, with:
– (tenant-level) Allow users to create new modern pages: ON
– (tenant-level) Allow commenting on modern pages: ON
– web feature “Site Pages” – “Allows users to add new site pages to a site”: Activated
| User Permissions | can create Page | can edit page | can Enable/Disable page comments | can comment on Page |
| Full Control (Owner) | Yes | Yes | Yes | Yes |
| Edit (Member) | Yes | Yes | Yes | Yes |
| Read (Visitor) | No | No | No | Yes |
There is a web feature “Site Pages” – “Allows users to add new site pages to a site”.
The feature is activated by default:

What if we disable this feature?
“New -> Page” has disappeared from “New” menu under “Site Contents” for Owners and Members…
From “Home” and “Pages” you still can see “New -> Page” options.
You can still create a new page from but if you try to create a page from Pages – “Sorry, something went wrong” “Cannot create a Site Page. Please have your administrator enable the required feature on this site.” :

Office 365 behavior, with:
– (tenant-level) Allow users to create new modern pages: ON
– (tenant-level) Allow commenting on modern pages: ON
– web feature “Site Pages” – “Allows users to add new site pages to a site”: Deactivated
| User Permissions | can create Page | can edit page | can Enable/Disable page comments | can comment on Page |
| Full Control (Owner) | Yes, but only from “Home” not from “Site Contents” or “Pages” | Yes | Yes | Yes |
| Edit (Member) | Yes, but only from “Home” not from “Site Contents” or “Pages” | Yes | Yes | Yes |
| Read (Visitor) | No | No | No | Yes |
If we disable feature “Site Pages” – “Allows users to add new site pages to a site” on the root web – it does not affect subsites (subwebs).
Can we Activate/Deactivate the feature “Site Pages” using PowerShell?
PowerShell
(TBP)
References
– Microsoft “Allow users to create and comment modern pages“
See also:
– Allow commenting on modern pages
N4370N 1984 Piper PA-28-181
Office 365 Search scopes
Search is everywhere in Microsoft 365. You can search from SharePoint, Teams, Delve, Yammer etc.
But! You cannot search for anything from everywhere!
Upd Oct 2025: Microsoft finished moving all services to cloud.microsoft and launched web-based Copilot and Search from m365.cloud.microsoft. E.g.
– Copilot: https://m365.cloud.microsoft/chat
– Search: https://m365.cloud.microsoft/search
What is interesting is search here works across all services – Exchange, SharePoint, Teams so from one place you can search content in emails, SharePoint pages, documents, lists, Teams chats.
Original article:
- Search for your Teams chat messages works only in Teams.
- But from Teams you cannot search for regular (non-group) sites and public teams sites
- All descriptions are totally out of search (e.g. site description, library/list description – including Yammer groups, Teams and regular sites).
- Public Team Sites content is not searchable from Teams and Yammer
So, what are the scopes of each search entry point in Office 365 and is there an entry point you can search for everything?
| Search scopes | SharePoint Search center | SharePoint home Office portal Office desktop app Delve | Teams | Bing |
| SharePoint content | Yes | Yes | Yes | |
| Teams content | Yes | Yes | Yes | Yes |
| Teams chats | (*1) | Yes | Yes | |
| Yammer content | Yes | Yes | Yes | |
| Yammer chat | (*1) | Yes | ||
| User profiles | Yes | Yes | ||
Detailed:
| Scope | Out of Scope | |
| SharePoint Search Center | – all sites content (Teams, Yammer, regular), – user profiles – OneDrive | Teams chat Yammer chat |
| SharePoint Landing Page | same as SharePoint Search center but Teams chats and Yammer Conversations are coming | same as SharePoint Search Center |
| Office.com | same as SharePoint (Teams chats and Yammer Conversations are coming after SharePoint) | same as SharePoint |
| Delve | ||
| Teams | Teams content Teams chat | OneDrive Yammer User Profiles regular SharePoint sites |
| Bing | Everything* | * except people profiles content (e.g. about me) |
Seems like the only tool you can search for EVERYTHING with is Microsoft Bing:
Update: there are rumors that Microsoft is decommissioning work search in Bing… Pity… But something tells me that decomm is due to lack of usage/popularity, so Microsoft will introduce something similar…

After Microsoft add Teams chats and Yammer conversations to SharePoint landing page search scope (then to Office home page) – it’ll be the best place to search from for everything.
More on Microsoft Search vs SharePoint Search and Microsoft Search RoadMap
Microsoft Office 365 Search: Find what you need with Microsoft Search in Bing
It is possible customize Modern Microsoft Search pages with PnP Modern Search





