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).
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 .
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.
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)
South Central US
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“)
Search is everywhere in Microsoft 365. You can search from SharePoint, Teams, Delve, Yammer etc.
But! From SharePoint you cannot search for Teams chats (*1). From Teams you cannot search for regular (no-group) sites. Sites descriptions are totally out of search (including Yammer groups, Teams and regular sites).
So, what are the scopes of each search entry point in Office 365 and is there an entry point you can search for everything?
SharePoint Search center
SharePoint home Office portal Office desktop app Delve
(*1) Microsoft announced they are working on bringing conversations (both Teams chats and Yammer) to SharePoint landing page first, then to Office home page.
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
same as SharePoint (Teams chats and Yammer Conversations are coming after SharePoint)
same as SharePoint
Teams content Teams chat
OneDrive Yammer User Profiles regular SharePoint sites
* except people profiles content (e.g. about me)
Seems like the only tool you can search for EVERYTHING with is Microsoft Bing:
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.
Microsoft recommend “flat structure”, i.e. no subsites. So SPO admins are disabling subsites creation at tenant level. Did you know that you still can create subsite? Let me explain how it is done.
If creation subsites is allowed, you should be able to see it like this:
But actually subsites are not always best practice. Microsoft recommend “flat structure”, i.e. instead of subsite you should have a separate site collection, and if you need a hierarchy and navigation – use Hub sites. So, in Office 365 SharePoint admins usually “disable” SubSites creation:
Now, you see, SubSites are not really disabled, but only the button to create subsites is hidden: “This controls whether the Subsite command appears on the New menu on the Site contents page”.
Anyway, the result is: you are not able to create a SubSite (web) in SharePoint Online:
Actually there are at least 3 options to create a SubSite:
Quick and simple answer: use SharePoint Search center or Microsoft Search, (or Bing if it is integrated).
Detailed explanation on how to find a public Team
In Microsoft Office 365, under MS Teams, there are 3 team types:
Private team: you can only join the team if you are invited or know the team code. SharePoint site behind the private team is shared only to members – not for everyone. You cannot see team name or description or content until you are team member (details). You are not able to search for the team name or content.
Public team: you can join the public team if you wish. The site behind the public team is shared with everyone except external users, so you can see public team name and description, but from MS Teams (desktop or web application) you cannot see public team content until you are team member.
Org-wide team: you are joined the team automatically (details)
From Teams – you can click on “Join or create a team” and you should be able to see some publicteams (but not all):
There is a “Search teams” box at the top right, so what if you are looking for a specific public team (not in the list) …
You know exact team name or at least some first letters. Solution: You are lucky. Just start typing team name in search bar at top right and hit “enter”- you will see shortened list of public teams matching your search criteria:
NB: do not use wildcards, it will not work:
NB: do not use top search bar, it will not work:
You want to join a public team, but you do not know exact team name. You know (or guess) something about the team, like
part of the team name
part of the team description
some keywords from team content files
Unfortunately, in this case both great Microsoft technologies – Search and Team – fail. You will not be able to find a public team:
Solution: use SharePoint search SharePoint site is created once a team is created.
For public teams – SharePoint site has “Everyone except external users” by default in “Members” group:
which means literally “Everyone except external users” has access to the site with “Edit” permissions.
SharePoint search is security-trimmed, i.e. you will see the site content in search results only if you do have access to the site. So just go to the SharePoint or SharePoint search center and search for what you know or guess about the team:
You can use all the power of SharePoint search (wildcards, refiners, keyword query language KQL etc)
Once you found something – you can go to the SharePoint site:
Now from the site – look at the site name and hover the mouse over the site name – you’ll see pop-up window. Now you know exact team name – and you can search for the team under Teams, or, if you are so lucky you see “Join” button – just join the team.click site title or hove over the site title:
One moment – you cannot see team’s chat messages in SharePoint, as chats are kept in Azure. But you can search for chat content after you joint the team.
Somehow both – SharePoint Search and Teams Search are not working against site/team description. Hopefully this bug will be addressed.
You can also search for site Url in teams. When you create a team – Office 365 generates a short team name (removes spaces and adds numbers if the team name is not unique; e.g. if the team name “Test” you might have “test381” as a short name, but if the team name is “This Is My Unique Team” – short name might be “ThisIsMyUniqueTeam”). After you can change team name and/or SharePoint site name. Team search under MS teams work for both names – short name initially assigned (kept as site specific Url) and new team name. But only starting with the beginning of the string.
By default site creation is enabled and anybody can create a new site collection from SharePoint start page :
with two options: “Team site connected to an Office 365 group” and “Communication site”
SharePoint administrator might disable Sites creation. In Office 365 under SharePoint Admin Center -> Settings -> Site Creation there is “Let users create sites from the SharePoint start page and OneDrive”:
Under classic settings page -> Site Creation it is called “Show the Create site command” with explanation “Display the Create site command on the SharePoint home page and in the sites list in OneDrive so users can create new sites”:
If site creation is disabled, user will not see “+ Create site” in SharePoint landing page:
The fun part is users are still able to create a new Office-365 group based site collection as “Let users create sites from the SharePoint start page and OneDrive” means literally “from the SharePoint start page and OneDrive” and does not mean you cannot create a site from other places. The same with “Show the Create site command” as it is literally about “Show…command” but not “disable … command”.
Option 1: from OneDrive, using “Create shared library”:
Option 2: using direct link:
Use Direct link: https://changeThisToYourTenantName.sharepoint.com/_layouts/15/CreateGroup.aspx e.g. https://contoso.sharepoint.com/_layouts/15/CreateGroup.aspx
Option 3: from teams:
and worth to mention that from Teams anybody can create a Team and a corresponding SharePoint site:
Unfortunately, if sites creation is disabled, you cannot create a communication site.
How to disable self-sites creation for real
The only way to limit self-site creation is using PowerShell: – create a security group – add to this group users who will be able to create sites – via PowerShell Set-AzureADDirectorySetting command set “GroupCreationAllowedGroupId” property Microsoft: “Manage who can create Groups“
VERBOSE: [VPC]: [[SPOTenantSettings]MyTenantSettings] Test-TargetResource returned False
VERBOSE: [VPC]: LCM: [ End Test ] [[SPOTenantSettings]MyTenantSettings] in 11.4040 seconds.
VERBOSE: [VPC]: LCM: [ Start Set ] [[SPOTenantSettings]MyTenantSettings]
VERBOSE: [VPC]: [[SPOTenantSettings]MyTenantSettings] Setting configuration for SPO Tenant
VERBOSE: [VPC]: [[SPOTenantSettings]MyTenantSettings] The use of the public CDN is not enabled, for that the PublicCdnAllowedFileTypes par
ameter can not be configured and will be removed
A parameter cannot be found that matches parameter name 'Ensure'.
+ CategoryInfo : InvalidArgument: (:) , CimException
+ FullyQualifiedErrorId : NamedParameterNotFound,SharePointPnP.PowerShell.Commands.Admin.SetTenant
+ PSComputerName : localhost
VERBOSE: [VPC]: LCM: [ End Set ] [[SPOTenantSettings]MyTenantSettings] in 3.7290 seconds.
The PowerShell DSC resource '[SPOTenantSettings]MyTenantSettings' with SourceInfo
'C:\scripts\o365\Office365DSC\o365DSC_Config_Tenant.ps1::12::9::SPOTenantSettings' threw one or more non-terminating errors while running the Set-TargetResource
functionality. These errors are logged to the ETW channel called Microsoft-Windows-DSC/Operational. Refer to this channel for more details.
+ CategoryInfo : InvalidOperation: (:) , CimException
+ FullyQualifiedErrorId : NonTerminatingErrorFromProvider
+ PSComputerName : localhost
VERBOSE: [VPC]: LCM: [ End Set ]
The SendConfigurationApply function did not succeed.
+ CategoryInfo : NotSpecified: (root/Microsoft/...gurationManager:String) , CimException
+ FullyQualifiedErrorId : MI RESULT 1
+ PSComputerName : localhost
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Time taken for configuration job to complete is 15.486 seconds
and see the magic! Now you have another folder on your local Windows machine:
– but this time OneDrive synchronizes it to regular SharePoint site.
There is also a “Personal OneDrive” – the same as regular OneDrive but free… (again, do not be confused: initially there was just OneDrive – free personal version and OneDrive for Business – version you could have with Office 365 subscription; now they are Onedrive and Personal OneDrive 🙂 )
OneDrive is a Microsoft thing.
Google has “Drive File Stream” (Google drive)
Dropbox – Dropbox sync
If you are managing SharePoint search, specifically if you are customizing SharePoint search schema, especially in SharePoint Online (Office 365) – you know how slow it works and how tiresome it is to “Search for a crawled property name”.
Recently I found out that wildcard works. No, even two wildcards work!
In this example I need crawled property started from ows and contains doc and type: