<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Microsoft Cloud Developer]]></title><description><![CDATA[My experiences with Office365 and Azure development]]></description><link>http://www.msclouddeveloper.com/</link><generator>Ghost 0.11</generator><lastBuildDate>Tue, 21 Apr 2026 03:19:27 GMT</lastBuildDate><atom:link href="http://www.msclouddeveloper.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[SharePoint Advanced Management - Minor features (4 of 4)]]></title><description><![CDATA[<p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3</a></li></ul>]]></description><link>http://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-4-of-4/</link><guid isPermaLink="false">b0e1b6a5-0b62-454b-b00b-7aaff2b6e0e5</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 13 Dec 2024 12:17:10 GMT</pubDate><media:content url="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--4.png" medium="image"/><content:encoded><![CDATA[<img src="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--4.png" alt="SharePoint Advanced Management - Minor features (4 of 4)"><p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-4-of-4/">Minor SAM features - page 4 of 4</a></li>
</ul>

<h1 id="minorsamfeautures">Minor SAM feautures</h1>

<p>There are more features to SAM, which are a little less extensive than the features presented on the first 3 pages. <br>
Here they are:</p>

<h4 id="blockdownloadpolicyforsharepointandonedrive">Block download policy for SharePoint and OneDrive</h4>

<p>Prevent download for both external and internal users</p>

<p>Review: This could already be achieved via standard SP Restricted View permissions (or Conditional access). However, this block download policy is easier to use and more secure (no mistakes in assigning permissions can happen). It also blocks printing. <br>
Its useful for higly confidential or top secret sites where content may not leak out at all.</p>

<h4 id="changehistory">Change history</h4>

<p>Find all actions taken by Admins on all or specific SharePoint sites</p>

<p>Review: Nice feature, but I doubt it will be used a lot. In some cases, where mistakes have been made, it could come in handy.</p>

<h4 id="defaultsensitivitylabelsfordocumentlibraries">Default sensitivity labels for document libraries</h4>

<p>Help make sure sensitive project files are appropriately labeled</p>

<p>Review: If you're already requiring each document to be labelled then the impact of this feature will not be very high. If you have no labelling in place yet, it may be useful to start with the document libraries.</p>

<h4 id="onedriveaccessrestriction">OneDrive access restriction</h4>

<p>Allow only particular groups of users to use OneDrive</p>

<p>Review: Could be useful feature to prevent unwanted OneDrive usage, for example for accounts of external users.</p>

<h4 id="aiinsights">AI Insights</h4>

<p>As part of the reporting and policies available in SAM, you can get an AI generated insights report about the results. </p>

<p>Review: This gives quick insights into the main issues the report surfaces. But in most cases, you will be interested in the site-by-site results not just the general conclusion about thousands of sites in a few lines.</p>

<h2 id="finalcommentsaboutsharepointadvancedmanagement">Final comments about SharePoint Advanced Management</h2>

<p>Hopefully, the explanation and screenshots gives a good first impression on the features provided in SAM. <br>
Overall, I think it is a great addition to facilitate governance and management of SharePoint Online. Now that it will come free with Copilot from early 2025, a lot more companies can reap the benefits of SAM and improve their SharePoint tenant management. So, I suggest you acquire at least a few Copilot licenses for your IT admins in 2025, so they can maintain and govern the SP tenant better.</p>]]></content:encoded></item><item><title><![CDATA[SharePoint Advanced Management - Site policies (3 of 4)]]></title><description><![CDATA[<p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3</a></li></ul>]]></description><link>http://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/</link><guid isPermaLink="false">12750f3a-3e07-4508-ac3a-5a0fc40a08d5</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 13 Dec 2024 12:15:32 GMT</pubDate><media:content url="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--3.png" medium="image"/><content:encoded><![CDATA[<img src="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--3.png" alt="SharePoint Advanced Management - Site policies (3 of 4)"><p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-4-of-4/">Minor SAM features - page 4 of 4</a></li>
</ul>

<h1 id="sitelifecyclefeatures">Site lifecycle features</h1>

<p>This feature can <em>find sites</em> based on certain conditions and automatically <em>apply a policy</em> on them, and address site owners and have them <em>remediate</em> the problem.</p>

<p>Currently there are two types of policies. </p>

<ul>
<li>Inactive sites policy, and </li>
<li>site ownership policy (in preview)</li>
</ul>

<p>Policies can be <strong>simulated</strong> first, and only after checking the results <strong>activated</strong>.</p>

<h3 id="inactivesitespolicy">Inactive sites policy</h3>

<ul>
<li>Identify inactive sites based on visits, edits, file actions and even Teams or Viva engage activity.</li>
<li>Send notifications to site owners or admins.</li>
<li>Possible actions: None, Set to readonly, Archive site.</li>
</ul>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/inactive_1.png" alt="SharePoint Advanced Management - Site policies (3 of 4)">
<em>Inactive sites policy page 1</em></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/inactive_2.png" alt="SharePoint Advanced Management - Site policies (3 of 4)">
<em>Inactive sites policy page 2</em></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/inactive_3.png" alt="SharePoint Advanced Management - Site policies (3 of 4)">
<em>Inactive sites policy page 3</em></p>

<h3 id="microsoftarchive">Microsoft Archive</h3>

<p>So, you can automatically trigger a site to be archived in M365 Archive after a period of inactivity. <br>
However, M365 Archive currently has the following downsides:</p>

<ul>
<li>You can only archive a <strong>complete site collection</strong>. This means that only sites that are completely, 100% inactive can be archived. If one file is being worked on, you cant easily archive it. NB: File level archiving is scheduled for the second half of 2025.</li>
<li>Reactivation of archived sites when a one or more files are needed again is <em>pretty expensive</em></li>
<li>Archived sites cannot be searched through to see if it does or does not contain a file an end-user might need back. A end-user search feature is also in development for release in 2025.</li>
<li>Due to the combination of these three points, you run a <strong>high risk of running into high cost</strong> because you need to reactivate a large site in order to get back a certain file. This is the exact opposite of why you want archiving, which is to <em>reduce cost for storage</em>.</li>
<li>There is PowerShell support for archiving a site. This can be used to setup your own archiving process using M365 Archive.</li>
</ul>

<h3 id="siteownershippolicy">Site ownership policy</h3>

<ul>
<li>Identify sites that don't meet organization's ownership criteria (minimum 1 or minimum 2 owners are the only options).</li>
<li>Send notifications to find new site owners or admins.</li>
<li>Possible actions: None, Set to readonly.</li>
</ul>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/owner_1.png" alt="SharePoint Advanced Management - Site policies (3 of 4)">
<em>Site ownership policy page 1</em></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/inactive_2-1.png" alt="SharePoint Advanced Management - Site policies (3 of 4)">
<em>Site ownership policy page 2</em></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/owner_3.png" alt="SharePoint Advanced Management - Site policies (3 of 4)">
<em>Site ownership policy page 3</em></p>

<h3 id="myreviewcommentsforbothsitelifecyclepolicies">My review comments for both site lifecycle policies</h3>

<ul>
<li>Filtering options are very limited!! We can only exclude max 100 sites. No filtering based on site property bag if you use that</li>
<li>Opportunity: Handle all classic sites, or all teams connected sites.</li>
<li>Risk: special purpose sites are hard to filter out due to limitation of 100 exceptions. Wild card URLs are not supported in the exception list.</li>
<li>Mails are sent from generic SharePoint address -> many people may not reply or take action.</li>
<li>Easy to configure and useful to improve governance.</li>
<li>Impact of the policy can be determined by running a simulation and investigating the results.</li>
<li><a href="https://learn.microsoft.com/en-us/sharepoint/site-lifecycle-management">Microsoft Learn page - Site lifecycle management</a></li>
</ul>

<p>Continue to <a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-4-of-4/">Minor SAM features - page 4 of 4</a></p>]]></content:encoded></item><item><title><![CDATA[SharePoint Advanced Management - Oversharing (2 of 4)]]></title><description><![CDATA[<p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3</a></li></ul>]]></description><link>http://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/</link><guid isPermaLink="false">29a02f52-fb6b-41f7-9521-d243479e3bfd</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 13 Dec 2024 12:14:19 GMT</pubDate><media:content url="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--2.png" medium="image"/><content:encoded><![CDATA[<img src="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--2.png" alt="SharePoint Advanced Management - Oversharing (2 of 4)"><p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-4-of-4/">Minor SAM features - page 4 of 4</a></li>
</ul>

<h1 id="featuresagainstoversharing">Features against oversharing</h1>

<p>A common problem for many companies using M365 and SharePoint is that a lot of content is overshared. This can lead to security incidents, especially when there are M365 services that push that content into people's awareness. Previously, Delve suffered from this issue, because of surfacing content on the Delve site. Now, Copilot suffers from the same problem, some sensitive content that was invisible before now shows up in the answer to a query.</p>

<p>A big part of the issue is the usage of the <em>Everyone Except External Users (EEEU)</em> group, which is the easiest way to share content with a lot of colleagues but because of that also leads to oversharing.</p>

<p>SharePoint Advanced Management contains two new ways to combat oversharing to the usage of the EEEU group:</p>

<ul>
<li>Data governance reporting and site reviews</li>
<li>SharePoint site access restriction</li>
</ul>

<h3 id="datagovernancereportingandsitereviews">Data governance reporting and site reviews</h3>

<p>There are currently 4 types of reports available in the SharePoint admin center. <br>
Site access reviews are available for the following reports:</p>

<ul>
<li>Sharing link reports (Anyone, PeopleInYourOrg, Specific People shared externally)</li>
<li>Content shared with 'Everyone except external users'" reports</li>
<li>Oversharing baseline report using permissions (only via <strong>PowerShell</strong>)</li>
</ul>

<p>There is one other report which concerns sensitivy labels, but it doesnt support a site review.</p>

<p>This feature lets you <strong>run a report</strong> on content that is shared with the EEEU group for example. Then, once the report has been created, you can <strong>initiate a site review</strong> for sites in the report. A site review means the site owner gets a mail, and he can then go to a special, new <strong>site review page</strong> in the site and then remediate the oversharing issues. If he doesn't complete the review, he will be reminded a number of times to do it.</p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/site_access_review_0.png" alt="SharePoint Advanced Management - Oversharing (2 of 4)">
<em>Site sharing admin report</em></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/site_review_1.jpg" alt="SharePoint Advanced Management - Oversharing (2 of 4)">
<em>Site review email</em></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/site_access_review.png" alt="SharePoint Advanced Management - Oversharing (2 of 4)">
<em>Site review page</em></p>

<h4 id="myreviewcomments">My review comments</h4>

<ul>
<li>Provides useful reporting with excel download, and the reports can be started from PowerShell.</li>
<li>Site review process for site owners is completely new and can help IT admins and Security department delegate oversharing remediation.</li>
<li>The feature is <em>reactive</em>. It will allow people to remediate oversharing after the fact has happened, it will not prevent it. It also depends on the site owners willingness to remediate the issues.</li>
<li>Only related to sharing in last 30 days. This is a big limitation in large, and older tenants that are already suffering from oversharing for a long time</li>
<li>Reports can only run once every 24h</li>
<li>A site review creates a new list in the site called <code>DO_NOT_DELETE_SITE_REVIEW</code>. This is ugly, don't understand why this list is not hidden.</li>
<li>Site review action can be initiated only for top 100 from the admin center.</li>
<li>These are reports that can initiate a review process (with reminders), but they are not <em>policies</em> that do continuing, recurring remediations over a longer period of time.</li>
<li>Powershell support for initiating site review based on a report via Start-SPOSiteReview. </li>
<li>To test: Check if site review can be initiated via PS for all sites in a report, not just top 100.</li>
<li>I ran into a few bugs on our test environment where the site review page didnt work correctly.</li>
<li><a href="https://learn.microsoft.com/en-us/SharePoint/data-access-governance-reports">Microsoft learn page - data governance reports</a></li>
</ul>

<h3 id="sharepointsiteaccessrestriction">SharePoint site access restriction</h3>

<p>This feature will <strong>block people</strong> from outside the site’s main security group to access the site. It can also <strong>prevent sharing</strong> of the site and files with any other group or user. <br>
The access restriction for a site can only be enabled by an <strong>IT admin</strong> from the admin center or via PowerShell. <br>
The <strong>sharing control settings</strong> for the restricted access sites has to first be enabled via PowerShell for the whole tenant (so all sites with restricted access enabled). <br>
Once enabled: Sharing is allowed with Microsoft Entra Security or M365 groups which are part of the restricted access control groups list. Thus, sharing with all other groups including Everyone except external users (EEEU) or individual users won’t be allowed.</p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/RAC_1.png" alt="SharePoint Advanced Management - Oversharing (2 of 4)">
<em>User outside of the M365 group trying to access a RAC enabled site</em></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/RAC_2.png" alt="SharePoint Advanced Management - Oversharing (2 of 4)">
<em>Trying to share site or file with 'Everyone Except Externals group' denied</em></p>

<h3 id="myreviewcomments">My review comments</h3>

<ul>
<li>A "Read more" message and link can be configured for the page users see when they are blocked on the site.</li>
<li>As Admin you can use PowerShell to generate a report on access denials for users, and on which sites RAC is enabled.</li>
<li>PowerShell is supported. This means the RAC setting can be automatically applied to new Highly confidential sites within your site provisioning process.
This feature could be used to prevent sharing with ‘Everyone’ for new Highly confidential sites.  </li>
<li>But it will have considerable user impact: Users will not be able to share files on a Highly confidential site with others, not even one single file. They will need to find another location to share those files, outside of their main site for the team, department or project.</li>
<li>When you enable RAC on an existing site with files shared with other users, they will immediately lose access.</li>
<li>The feature is <em>proactive</em>, when enabled on a site it immediately prevents any oversharing on newly created sites and also stops oversharing on existing sites.</li>
<li><a href="https://learn.microsoft.com/en-us/sharepoint/restricted-access-control">MS Learn page - Site access control</a></li>
</ul>

<p>Continue to <a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3 of 4</a></p>]]></content:encoded></item><item><title><![CDATA[SharePoint Advanced Management - First Impressions (1 of 4)]]></title><description><![CDATA[<p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3</a></li></ul>]]></description><link>http://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/</link><guid isPermaLink="false">55a87257-d5ae-4f54-a694-b2d05a503ea4</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 13 Dec 2024 11:55:00 GMT</pubDate><media:content url="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--1.png" medium="image"/><content:encoded><![CDATA[<img src="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1--1.png" alt="SharePoint Advanced Management - First Impressions (1 of 4)"><p>This sequence of posts is about my first impressions of the SharePoint Advanced Management add-on features for M365/SharePoint Online. <br>
There are four posts in total:</p>

<ul>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-1-of-4/">Introduction of SharePoint Advancement Management - page 1 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-3-of-4/">Site lifecycle features - page 3 of 4</a></li>
<li><a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-4-of-4/">Minor SAM features - page 4 of 4</a></li>
</ul>

<h1 id="introductionofsharepointadvancementmanagement">Introduction of SharePoint Advancement Management</h1>

<p>From <a href="https://learn.microsoft.com/en-us/sharepoint/advanced-management">MS Learn - SharePoint Advanced Management</a>:</p>

<blockquote>
  <p>Microsoft SharePoint Premium - SharePoint Advanced Management is an essential add-on for Microsoft 365 that equips IT administrators with a powerful suite of tools to bolster content governance throughout the Microsoft Copilot deployment journey.</p>
</blockquote>

<p><img src="http://www.msclouddeveloper.com/content/images/2024/12/0-sam-overview-pillars-new--1-.png" alt="SharePoint Advanced Management - First Impressions (1 of 4)"></p>

<p>I can't afford it you say? Well, starting from <strong>early 2025</strong> the full SAM add-on will be available to all tenants that have <strong>at least one Copilot license</strong>, see <a href="https://techcommunity.microsoft.com/blog/microsoft365copilotblog/accelerate-microsoft-365-copilot-adoption-with-built-in-content-governance/4298951">https://techcommunity.microsoft.com/blog/microsoft365copilotblog/accelerate-microsoft-365-copilot-adoption-with-built-in-content-governance/4298951</a></p>

<p>This means you'll get access to the admin center reports, but also to the <strong>site lifecycle</strong> features that contact site owners, and the <strong>site reviews</strong> which are also aimed at site owners!</p>

<p>In this blog series I will discuss the main features within SAM, and based on my first impressions discuss their usefulness and what are some downsides.</p>

<p>On the next page I will discuss features against oversharing, which are the sharing reports in the admin center plus the site review functionality, and also the SharePoint Site Access Restriction feature.</p>

<p>Continue to <a href="https://www.msclouddeveloper.com/sharepoint-advanced-management-first-impressions-2-of-4/">Features against oversharing - page 2 of 4</a></p>]]></content:encoded></item><item><title><![CDATA[Pixel 7 Fingerprint scanner issues]]></title><description><![CDATA[<p>Totally off-topic, but I recently bought a Pixel 7 from Google and was going insane on the terrible finger print scanner on the front screen. Finally, it seems it works a bit better thanks to <a href="https://www.reddit.com/r/GooglePixel/comments/y6l3m7/for_those_with_pixel_7_fingerprint_issues/">this topic on reddit</a>.</p>

<p>These are often cited tips in the thread:</p>

<ul>
<li>Setup your fingerprints</li></ul>]]></description><link>http://www.msclouddeveloper.com/pixel-7-fingerprint-scanner-issues/</link><guid isPermaLink="false">1782e947-c4f0-4184-b0f5-681795aaf629</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 09 Feb 2024 09:11:48 GMT</pubDate><content:encoded><![CDATA[<p>Totally off-topic, but I recently bought a Pixel 7 from Google and was going insane on the terrible finger print scanner on the front screen. Finally, it seems it works a bit better thanks to <a href="https://www.reddit.com/r/GooglePixel/comments/y6l3m7/for_those_with_pixel_7_fingerprint_issues/">this topic on reddit</a>.</p>

<p>These are often cited tips in the thread:</p>

<ul>
<li>Setup your fingerprints in the dark or in low-light conditions.</li>
<li>During setup press as hard as you normally do during unlock. Many people (including me) press pretty hard during setup to get the device to understand my fingerprint. But if you normally unlock with a light press, also make sure to press lightly during setup.</li>
<li>Register the same finger twice during setup.</li>
</ul>

<p>I dont use a screen protector myself, but you could play with the screen protector settings (in Display menu) if you do. Some people say disabling it, actually makes the finger print sensor work better.</p>]]></content:encoded></item><item><title><![CDATA[Azure automation Out of Memory exception]]></title><description><![CDATA[<p>For a long running script that was also executed in a lot of batches in Azure Automation, we recently started getting this error occasionally: <br>
<code>Thread failed to start. (Thread failed to start. (Exception of type 'System.OutOfMemoryException' was thrown.))</code></p>

<p>We contacted MS Support about it, since there were no changes</p>]]></description><link>http://www.msclouddeveloper.com/azure-automation-out-of-memory-exception/</link><guid isPermaLink="false">35a0b2bf-9102-4cf8-82a5-9f046cfa4bd4</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Thu, 26 Oct 2023 09:26:47 GMT</pubDate><content:encoded><![CDATA[<p>For a long running script that was also executed in a lot of batches in Azure Automation, we recently started getting this error occasionally: <br>
<code>Thread failed to start. (Thread failed to start. (Exception of type 'System.OutOfMemoryException' was thrown.))</code></p>

<p>We contacted MS Support about it, since there were no changes to the script and the error only happenend very rarely.</p>

<p>We received the reply that Microsoft is working on moving the underlying Azure Automation infrastructure into Azure containers which probably cause the issue. It should auto-resolve after the move has been completely performed.</p>

<h4 id="replyfrommicrosoftsupport">Reply from Microsoft Support</h4>

<blockquote>
  <p>->Currently, Azure automation is in the process of migrating from SQL Sandbox to Azure containerized environment, we see that the jobs which were running successfully are failing in container environment. More details of this process as below.</p>
  
  <p>Azure Automation is currently in the process of modernizing its backend platform and bring forth a range of improvements. The new platform offers enhanced performance and reliability. Platform updates have required changes to the internal directory structure and the usage of environment variables. If your runbooks have taken dependencies on those internal implementation details, you may find that the behavior of your runbooks in the new environment may change, and your runbooks may require updating in order to adapt to the new platform. The product team has put processes in place to minimize issues arising out of this backend change and is monitoring service health continuously. We are actively working on mitigating any issues and promise to extend our complete support to resolve your queries. </p>
  
  <p>As I checked from the backend, the jobs last failed are from 21st Oct which picked container as environment to run. This is a clear issue that has occurred because of migration to ACI(container). There is no action plan from your side, this will be resolved automatically.</p>
  
  <p>Apart from the above, I do not see any failed jobs that picked container environment.</p>
  
  <p>On 26th, I do see 10 jobs got generated out of which 4 picked container environment instead of Sandbox and completed successfully. Below are the 4 job ids:</p>
  
  <p>As per the latest update from PG on 26th Oct, 70% of the deployment has been completed in West Europe(automation account region). In the coming days, you will see all the jobs using only container environment.</p>
  
  <p>Kindly monitor if you see any failed jobs in the meantime and let me know so I can report them. Also, please reach out to me if you have further questions.</p>
</blockquote>]]></content:encoded></item><item><title><![CDATA[Stream migration - Fetch additional channel metadata]]></title><description><![CDATA[<p>While <a href="https://learn.microsoft.com/en-us/stream/streamnew/migration-details#stream-classic-video-report">the inventory report supplied by Microsoft</a> already exports quite some information about your videos in Stream Classic, there is also still some things missing. Such as the channels description and logo images. These can be used to setup a video portal with a site for each company-wide Stream classic</p>]]></description><link>http://www.msclouddeveloper.com/stream-migration-fetch-additional-channel-metadata/</link><guid isPermaLink="false">a7239894-376d-4d02-9241-16f4d88eba21</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Mon, 01 May 2023 15:32:14 GMT</pubDate><content:encoded><![CDATA[<p>While <a href="https://learn.microsoft.com/en-us/stream/streamnew/migration-details#stream-classic-video-report">the inventory report supplied by Microsoft</a> already exports quite some information about your videos in Stream Classic, there is also still some things missing. Such as the channels description and logo images. These can be used to setup a video portal with a site for each company-wide Stream classic channel for example and then use the same channel description and logo for the new SharePoint site. Then, when you migrate that channel into the SharePoint site using the migration tool, the experience for end-users is improved quite considerably as they will recognize the logo and the description besides the channel's name. <br>
You will need to <a href="https://learn.microsoft.com/en-us/stream/streamnew/migration-details#steps-to-run-the-script">fetch the token and paste it into a token.txt file such as described for the original Inventory report PowerShell</a>.</p>

<p>See <a href="https://github.com/jwiersem/StreamMigration/blob/main/StreamClassicChannelMetadataGenerator.ps1">this PowerShell script</a> to fetch additional metadata of Stream classic channels such as the description and logo. It will create a csv-file with the metadata and store all the logos in a subfolder /Images of the folder you run the script in. Remember that you need to create a token.txt file with the Bearer token that you got from the chrome dev tools on the Stream classic portal.</p>]]></content:encoded></item><item><title><![CDATA[Find, Create and Fill a Video playlist in SharePoint Online with PowerShell]]></title><description><![CDATA[<p>Here are three nice tips for handling the new playlists for videos in SharePoint Online. These could become handy during or after your MS Stream migration into SharePoint and OneDrive.</p>

<h4 id="findallplaylists">Find all playlists</h4>

<p>You can find all playlists via search using the managed property ListTemplateTypeId and a specific GUID. See</p>]]></description><link>http://www.msclouddeveloper.com/find-create-and-fill-a-video-playlist-in-sharepoint-online-with-powershell/</link><guid isPermaLink="false">95631ee8-c636-496e-a619-eb4ac9684319</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 14 Apr 2023 07:01:15 GMT</pubDate><content:encoded><![CDATA[<p>Here are three nice tips for handling the new playlists for videos in SharePoint Online. These could become handy during or after your MS Stream migration into SharePoint and OneDrive.</p>

<h4 id="findallplaylists">Find all playlists</h4>

<p>You can find all playlists via search using the managed property ListTemplateTypeId and a specific GUID. See <br>
<a href="https://yourtenant.sharepoint.com/_layouts/15/search.aspx/?q=ListTemplateTypeId%3A3a867b4a-7429-0e1a-b02e-bf4b240ff1ce">https://yourtenant.sharepoint.com/_layouts/15/search.aspx/?q=ListTemplateTypeId%3A3a867b4a-7429-0e1a-b02e-bf4b240ff1ce</a></p>

<p>KQL Query: <br>
<code>ListTemplateTypeId:3a867b4a-7429-0e1a-b02e-bf4b240ff1ce</code></p>

<h4 id="createplaylistandsettemplatetypeid">Create playlist and set TemplateTypeId:</h4>

<p>You must use the normal commands to get the PnP list template of a playlist created throught the GUI in order to create a playlist via PowerShell. You can find out how to do so online, for example <a href="https://www.c-sharpcorner.com/blogs/get-and-apply-pnp-template-of-a-specific-list-or-library-using-pnp-provisioning-engine">here</a>.</p>

<p>However, the TemplateTypeId field of the list cannot be set via a PnP Provisioning template. And if it's not set you will not find the list via search with the query above, but also the Playlist view of the list will not work correctly. You need to set the TemplateTypeId field using powershell with these commands:</p>

<p><code>
$list = Get-PnPList -Identity "Playlist";
$list.TemplateTypeId = "3a867b4a-7429-0e1a-b02e-bf4b240ff1ce";
$list.Update();
Invoke-PnPQuery; <br>
</code>
Because getting the pnp template and applying it is also non-trivial, you can check them out here:</p>

<ul>
<li><a href="http://www.msclouddeveloper.com/pnp-playlisttemplate-xml/">PnP Playlist template xml</a></li>
<li><a href="http://www.msclouddeveloper.com/addplaylist-ps1/">PowerShell to create list from template</a></li>
</ul>

<h4 id="creatinganiteminavideoplaylist">Creating an item in a video playlist</h4>

<p>Creating an item in a list using PowerShell is normally quite simple. However, the video playlist template uses a number of fields that are not even visible in the GUI and you need quite a lot of information about the video file in order to fill the fields. Using the browsers dev tool I found out what data to use during the list item creation to be able to create an item. The script works, however the final step to add the list item does still give an error. You can suppress that by adding parameter <code>-ErrorAction SilentlyContinue</code> to the Add-PnPListItem command. Should you find a way to remove the error altogether, let me know!</p>

<p>See <a href="http://www.msclouddeveloper.com/pnp-powershell-to-fill-video-playlist-in-sharepoint-online/">this PowerShell to create an item in a video Playlist</a>.</p>

<p>Sorry for the bad formatting of the PowerShell in markdown, to do that correctly still goes over my head :D</p>

<p>Here's a screenshot of a programmatically created playlist and programmatically added items:</p>

<p><img src="http://www.msclouddeveloper.com/content/images/2023/04/playlist_powershell.png" alt="Playlist screenshot"></p>]]></content:encoded></item><item><title><![CDATA[Feature SharePoint video playlist on page]]></title><description><![CDATA[<p>The video playlist feature was released just yesterday, but of course the MVP is quite limited. <br>
I did however find our a neat trick: You can create a nice overview of the videos in the playlist using the embed webpart!</p>

<p>Simply use the <strong>embed webpart</strong> with the link of the</p>]]></description><link>http://www.msclouddeveloper.com/feature-sharepoint-video-playlists-on-page/</link><guid isPermaLink="false">a84bc13b-266f-496e-a6c9-db54302868b5</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Thu, 16 Feb 2023 16:45:32 GMT</pubDate><content:encoded><![CDATA[<p>The video playlist feature was released just yesterday, but of course the MVP is quite limited. <br>
I did however find our a neat trick: You can create a nice overview of the videos in the playlist using the embed webpart!</p>

<p>Simply use the <strong>embed webpart</strong> with the link of the playlist. Get the link to the playlist when you click <strong>View Playlist</strong> after adding a video to it. <br>
Example link is: <a href="https://yourtenant.sharepoint.com/sites/jwtestgroup/Lists/Rabbits%20JW%20Test%20group/AllItems.aspx?env=WebViewList">https://yourtenant.sharepoint.com/sites/jwtestgroup/Lists/Rabbits%20JW%20Test%20group/AllItems.aspx?env=WebViewList</a></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2023/02/sp_playlist_embed.png" alt="Embedded video playlist"></p>]]></content:encoded></item><item><title><![CDATA[Swap the URLs of two SharePoint Online sites]]></title><description><![CDATA[<h3 id="orhowtoremovesharepointredirectsitestherightway">Or how to remove SharePoint redirect sites the right way!</h3>

<p>In some occasions you will want to change the URL of an SharePoint Online site. Maybe the function has changed or the team name for example. <br>
You can do that wiht the PnP PowerShell commandlet: <code>Rename-PnPTenantSite</code>.</p>

<p>When you do so</p>]]></description><link>http://www.msclouddeveloper.com/remove-sharepoint-redirect-sites-the-right-way/</link><guid isPermaLink="false">0173c2af-6565-45a6-b768-5c23b92c7613</guid><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Sun, 22 Jan 2023 12:12:43 GMT</pubDate><content:encoded><![CDATA[<h3 id="orhowtoremovesharepointredirectsitestherightway">Or how to remove SharePoint redirect sites the right way!</h3>

<p>In some occasions you will want to change the URL of an SharePoint Online site. Maybe the function has changed or the team name for example. <br>
You can do that wiht the PnP PowerShell commandlet: <code>Rename-PnPTenantSite</code>.</p>

<p>When you do so and it succeeds, your site will live on the new URL you specified and the old URL will redirect to that new location as well. <br>
The redirect happens by way of a special SharePoint site template with the template name <code>redirectsite#0</code>. <br>
In case you want to re-use the old URL you will have to remove the redirect site at that address. That can be done with the commandlet <code>Remove-PnPTenantSite</code>. <br>
One catch in the process that I have noticed, is that sometimes (but not always it seems) that if you use the <code>Get-PnPTenantSite</code> commandlet it will either get the redirect site or the site that is redirected to! <br>
If you want to get the actual redirectsite with template <code>redirectsite#0</code>, you can do it by first getting all sites of that template and then filtering the list by the URL. <br>
<code>$redirectSite1 = (Get-PnPTenantSite -Template "REDIRECTSITE#0") | Where-Object { $_.Url -eq $aSiteURL };</code></p>

<p>Make sure to always check after a site rename that:</p>

<ul>
<li>The site exists and works on the new URL</li>
<li>The old site's template is of type <code>redirectsite#0</code> before removing it.</li>
</ul>

<p>Should you've come here looking for a script to do a URL swap of two sites, look no further than this <a href="http://www.msclouddeveloper.com/powershell-swap-spo-site-urls/">PowerShell script to swap site URLs</a>.</p>]]></content:encoded></item><item><title><![CDATA[Simple scrum poker solution with PowerAutomate and Teams]]></title><description><![CDATA[<p>Background:</p>

<p>Teams working in an Agile methodology will have regular meetings where they prioritize the work they need to do (the <em>User Stories</em>) and vote for the effort and complexity of every story through <em>Scrum poker</em>.</p>

<p>Problem:</p>

<ul>
<li><p>Due to corona virus measures most Scrum planning and voting meetings happen via</p></li></ul>]]></description><link>http://www.msclouddeveloper.com/simple-scrum-poker-solution/</link><guid isPermaLink="false">40e175b4-31d0-4b96-8600-7bdb1502d6db</guid><category><![CDATA[Microsoft Flow]]></category><category><![CDATA[Microsoft Teams]]></category><category><![CDATA[Agile]]></category><category><![CDATA[Scrum]]></category><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Thu, 27 Aug 2020 12:01:11 GMT</pubDate><content:encoded><![CDATA[<p>Background:</p>

<p>Teams working in an Agile methodology will have regular meetings where they prioritize the work they need to do (the <em>User Stories</em>) and vote for the effort and complexity of every story through <em>Scrum poker</em>.</p>

<p>Problem:</p>

<ul>
<li><p>Due to corona virus measures most Scrum planning and voting meetings happen via MS Teams.</p></li>
<li><p>When you vote simply in a teams meeting chat, everyone will see the votes and people will be influenced by the first vote. Often the first vote determines all the responses.</p></li>
</ul>

<p>Solution:</p>

<ul>
<li>Create a simple Scrum poker bot solution where people can vote without others seeing their vote. Then post the results in a public channel for discussion.</li>
</ul>

<p>Solution in action:</p>

<p>Personal message from Flow bot to each voter <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/08/poker_flow_user_1.png" alt="Personal message from Flow bot"></p>

<p>Response submitted view of card <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/08/poker_flow_user_2.png" alt="Response submitted view of card"></p>

<p>Final message with responses of two people in teams channel (without any real formatting done :-) <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/08/poker_flow_user_3-1.png" alt="Final message with responses in teams channel"></p>

<p>Flow construction: <br>
1. Flow button trigger (manually trigger a flow) with a property <em>User Story Name</em> <br>
2. Three parameters <em>userStoryName</em> (string), <em>voters</em> (array of email addresses) and <em>responses</em> (empty array) <br>
3. <a href="http://www.msclouddeveloper.com/json-of-scrum-poker-adaptive-card/">Compose a JSON of the Adaptive card</a> we will post in Teams. <br>
4. Apply to each for the voter array: Add action <em>'Post an Adaptive card to a Team user and wait for response.</em> <br>
5. Append the response to an array. <br>
6. When all responses are collected, post the results in a Teams channel all the voters have access to.</p>

<p>NB: In order to read the results of the 'Post adaptive card and wait' action I had to create an expression since the responses were not selectable in the dynamic content. Must be an issue because of the Preview nature of the action.</p>

<p>The expression is <code>outputs('POSTCARDITERATION')?.body?.data?.acPollChoices</code> where <em>POSTCARDITERATION</em> is the name of the <em>'Post an Adaptive card to a Team user and wait for response</em> action and <em>acPollChoices</em> is the id of the selection control in the adaptive card.</p>

<p>High level overview of the Flow <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/08/poker_flow_overview.png" alt="Flow overview"></p>

<p>Flow Details 1 <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/08/poker_flow_1-1.png" alt="Flow 1"></p>

<p>Flow details 2 <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/08/poker_flow_2.png" alt="Flow 2"></p>

<p>Flow details 3 <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/08/poker_flow_3.png" alt="Flow 3"></p>]]></content:encoded></item><item><title><![CDATA[Progressive WebApp in SharePoint - the supported way]]></title><description><![CDATA[<p>A (long) while back I hacked a sharepoint site to behave as a Progressive Web App (PWA). I always wanted to improve that solution so it works well and is created using supported tooling. <br>
Recently I achieved just that in a Modern SharePoint site. Using only a SPFx Application customizer</p>]]></description><link>http://www.msclouddeveloper.com/progressive-webapp-in-sharepoint/</link><guid isPermaLink="false">55b30981-6be5-4c68-9b61-ccb57d2e2039</guid><category><![CDATA[PWA]]></category><category><![CDATA[SPFx]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 24 Jul 2020 13:30:26 GMT</pubDate><media:content url="http://www.msclouddeveloper.com/content/images/2020/07/install_pwa.png" medium="image"/><content:encoded><![CDATA[<img src="http://www.msclouddeveloper.com/content/images/2020/07/install_pwa.png" alt="Progressive WebApp in SharePoint - the supported way"><p>A (long) while back I hacked a sharepoint site to behave as a Progressive Web App (PWA). I always wanted to improve that solution so it works well and is created using supported tooling. <br>
Recently I achieved just that in a Modern SharePoint site. Using only a SPFx Application customizer and a manifest and serviceworker in the documents folder I received the install site popup!</p>

<p>Here's the proof: <br>
<img src="http://www.msclouddeveloper.com/content/images/2020/07/pwa_capture.gif" alt="Progressive WebApp in SharePoint - the supported way">
What you're looking at is a site that indicated it is installable in the address bar (the Plus icon shows that). I've captured the 'Add to Homescreen prompt and I trigger it when the button is pushed. Now a user can install the site as an App (it loads in it's own browser window automatically). The App is also findable in your computer's start menu.</p>

<p>Advantages:</p>

<ul>
<li>Installs the site as a true App</li>
<li>You can find it in Windows start menu</li>
<li>It has it's own pretty icon and name</li>
<li>Easy to find back important sites on your device.</li>
<li>Add to homescreen button is in clear view instead of hidden in the Chromium menu's.</li>
<li>You can load a serviceworker that does god knows what :-)</li>
</ul>

<p>For the code see the <a href="https://github.com/jwiersem/pwa-app-customizer">PWA App Customizer on GitHub</a></p>

<p>There are some hardcoded URLs in there, in the code of the App customizer I hardcoded the link to my service worker. And in the manifest file I hardcoded the starturl property that points to my SharePoint site. These you can easily change to your own environment. <br>
You will need to upload the three files that are in the Assets folder on GitHub into your shared documents folder in your site collection.</p>

<p>Future work:</p>

<ul>
<li><p>You can spice up your SharePoint Single Page App with the serviceworker. For example: Make it work offline.</p></li>
<li><p>Remove hardcoded urls</p></li>
</ul>]]></content:encoded></item><item><title><![CDATA[SharePoint & Logic Apps - Get items by list title]]></title><description><![CDATA[<p>Here's a short blog about a nifty trick a <em>TREMENDOUSLY</em> talented colleague of mine found.</p>

<h4 id="background">Background:</h4>

<p>Say you are developing a business application using Azure Logic Apps and SharePoint Online. <br>
You'll want to deploy it  to multiple SharePoint tenants or site collections within a tenant for system testing and user</p>]]></description><link>http://www.msclouddeveloper.com/logic-apps-sharepoint-actions-by-title/</link><guid isPermaLink="false">c8c5ab6c-3a5c-4221-8dc7-85445d6aec2f</guid><category><![CDATA[SharePoint]]></category><category><![CDATA[logic apps]]></category><category><![CDATA[ARM templates]]></category><category><![CDATA[Azure DevOps]]></category><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Fri, 10 Apr 2020 07:48:16 GMT</pubDate><content:encoded><![CDATA[<p>Here's a short blog about a nifty trick a <em>TREMENDOUSLY</em> talented colleague of mine found.</p>

<h4 id="background">Background:</h4>

<p>Say you are developing a business application using Azure Logic Apps and SharePoint Online. <br>
You'll want to deploy it  to multiple SharePoint tenants or site collections within a tenant for system testing and user acceptance test purposes. And later easily go live on freshly installed site collection.</p>

<p>When you're using SharePoint actions like <strong>Get Items</strong>, <strong>Update item</strong> or similar, you'll have noticed that after filling in the list you want to use, Logic Apps will change the action to use the <strong>list GUID</strong> instead of the title behind the scenes. That's all fine and dandy until you move the logic app to a new site or tenant with a different list. Your Logic App will not work without manually changing the selected list in <strong>all the sharepoint actions</strong>. This is very cumbersome and error-prone work to do.</p>

<p>When you setup a release pipeline in Azure DevOps and deploy the Logic Apps through ARM Templates (extract them with <a href="https://github.com/jeffhollan/LogicAppTemplateCreator">this great tool by Jeff Hollan</a>), you'll want to avoid such manual steps of course.</p>

<h2 id="solution">Solution</h2>

<p>Here's a simple trick to do it. When you are developing the Logic App, simply <em>define parameters</em> for the List titles and also the site url. Basically anything that will be different for a different site collection or tenant. The nice thing is that in update or create item actions you'll still be able to easily fill in the field values even though the actions is not tied to the list by a unique id.</p>

<p><img src="http://www.msclouddeveloper.com/content/images/2020/04/logic_app_parameters_1.png" alt="Logic App designer - parameters">
<sub>Define a parameter for a list tite</sub></p>

<p>After you have then extracted the ARM template, your JSON definition of the Logic App will no longer contain GUIDs to lists. It will simply use the list titles. </p>

<p><img src="http://www.msclouddeveloper.com/content/images/2020/04/logic_app_parameters_2.png" alt="ARM template parameters">
<sub>The parameters in the exported ARM template</sub></p>

<p>Of course, you need to make sure you create a site with the same titles by using a PnP template for example. Also, no one can be changing the list titles, so make sure you lockdown those permissions well.</p>

<p>Hopfully this trick will save you some manual labor and prevent some mistakes!</p>]]></content:encoded></item><item><title><![CDATA[SharePoint Online performance monitoring - Server side !]]></title><description><![CDATA[<h5 id="introduction">Introduction</h5>

<p>When you're managing a SharePoint online tenant you'll probably need to investigate performance on a regular basis. Sometimes users report issues and you'll need to open up a support case with Microsoft. <br>
Without supporting data you'll have a hard time providing the right information to really get a quality</p>]]></description><link>http://www.msclouddeveloper.com/server-side-sharepoint-online-performance-monitoring/</link><guid isPermaLink="false">a0c0dcac-dcbd-42c4-add9-8571f5d8ccb2</guid><category><![CDATA[SharePoint]]></category><category><![CDATA[Application Insights]]></category><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Mon, 24 Feb 2020 13:03:55 GMT</pubDate><content:encoded><![CDATA[<h5 id="introduction">Introduction</h5>

<p>When you're managing a SharePoint online tenant you'll probably need to investigate performance on a regular basis. Sometimes users report issues and you'll need to open up a support case with Microsoft. <br>
Without supporting data you'll have a hard time providing the right information to really get a quality reply and perhaps even a solution from MS side.</p>

<p>In this article I provide a way to monitor sharepoint performance by collecting performance and processing information Microsoft provides in every page request.</p>

<h5 id="prequisites">Prequisites</h5>

<ul>
<li>a SharePoint Online tenant.</li>
<li>a desktop/server/Azure Automation account to run a PowerShell script. Locally you'll need the <a href="https://www.microsoft.com/en-us/download/details.aspx?id=42038">SharePoint Client Components SDK</a> installed. </li>
<li>An Azure subscription with an Application Insights resource created.</li>
</ul>

<h5 id="solution">Solution</h5>

<p>Although differently for Modern and Classic pages, Microsoft provides some data on how the page request performed at their cloud servers' side like the request duration. Next to that, each page request has a corresponding correlation id that can be used by Microsoft to find errors in their server logfiles.</p>

<p>Here I provide a powershell script you can run on a desktop or in Azure Automation to collect the provided data and send it to Application Insights in Azure. Next to that I'll give a Application Insights query to create a graph of the custom monitoring events the powershell script sends.</p>

<p><a href="https://github.com/jwiersem/sharepoint_monitoring/blob/master/measure_sharePoint_performance_server_side.ps1">PowerShell Monitoring script</a></p>

<p>In the script you'll need to provide:</p>

<ul>
<li>An application Insights key (passed into the script by using a parameter)</li>
<li>You'll need to add URLs to modern and classic sites in the bottom of the script</li>
<li>If you run it locally you need to set the path to Microsoft.SharePoint.Client.dll</li>
</ul>

<p>Application Insights KUSTO query <br>
<code>customEvents
 | where name == "Event sharepoint monitoring script" 
 | where timestamp &gt;= ago(14d)
 | extend spRequestDuration = customDimensions.["spRequestDuration"] <br>
 | extend siteType = customDimensions.["SiteType"] <br>
 | summarize avgRequestDuration=avg(todouble(spRequestDuration)) by tostring(siteType), bin(timestamp, 5m) // use a time grain of 5 minutes
 | render timechart <br>
</code></p>

<p>You can add this query in the Azure Portal, when you go to the Application Insights you created and then go to <strong>Logs</strong> (Log analytics) in the left menu. From there you can <em>Pin</em> the graph to a Dashboard.</p>

<p>End result:</p>

<p><img src="http://www.msclouddeveloper.com/content/images/2020/02/server_side_monitoring.png" alt="Graph in Appication Insights"></p>

<p>There is no official SLA or guidance on what these values should be, but when you see modern sites showing an average request duration of over 1500ms for more than an hour, you definitely need to open a support case towards Microsoft. </p>]]></content:encoded></item><item><title><![CDATA[Run Azure Automation script for over three hours on SharePoint Online]]></title><description><![CDATA[<h2 id="background">Background</h2>

<p>Let's say you’re an administrator for a large company that has a substantial Office365 tenant that consist of many SharePoint sites (e.g. more than 20000). And you want to run some kind of monitoring or maintenance script on all those sites. Of course you want to use</p>]]></description><link>http://www.msclouddeveloper.com/run-azure-automation-script-for-over-three-hours-on-sharepoint-online/</link><guid isPermaLink="false">e223a44b-e511-4e81-a8dc-bf705e6d7459</guid><category><![CDATA[Azure Automation]]></category><category><![CDATA[Microsoft Flow]]></category><dc:creator><![CDATA[Jurgen Wiersema]]></dc:creator><pubDate>Thu, 05 Dec 2019 12:57:16 GMT</pubDate><content:encoded><![CDATA[<h2 id="background">Background</h2>

<p>Let's say you’re an administrator for a large company that has a substantial Office365 tenant that consist of many SharePoint sites (e.g. more than 20000). And you want to run some kind of monitoring or maintenance script on all those sites. Of course you want to use PnP PowerShell for that. <br>
When you've developed the script you notice processing each site takes a fair amount of time (e.g. more than a couple of seconds). Combine this with the large number of sites and your script needs a considerable amount of time to complete. You perhaps wants to run it on a schedule and not on your own machine either. You then have the option to run it on a local server or in Azure Automation. <br>
The local server may have some disadvantages related to network connectivity etc. That can happen quite often in large enterprises. <br>
Azure Automation is a joy to work with but in this case it also has a downside.</p>

<p><strong>Azure automation scripts are constricted to a maximum run time of three hours</strong></p>

<p>See <a href="https://docs.microsoft.com/en-us/azure/automation/automation-runbook-execution">Automation runbook execution</a>. If a script runs longer than three hours you will run into the error <br>
<em>The job was evicted and subsequently reached a Stopped state. The job cannot continue running.</em></p>

<h2 id="solution">Solution</h2>

<p>Basically any script that iterates over a collection could be done in a batched way. This means you only process a part of the whole collection in one go. By adjusting your script slightly and using Microsoft Flow/Power Automate to call the Automation Job you can reduce the run time per batch to stay under three hours. <br>
The collection in my case was the total number of site collections in the tenant. By doing 19 batches of a 1000 I could process all sites. <br>
Here's the general procedure:</p>

<ol>
<li><p>Update the script so it handles a batch instead of the whole collection.</p></li>
<li><p>Create a Flow that takes the total number of items (site collections) and a batchsize and the calls the Automation runbook a certain number of times (the batch count).</p></li>
</ol>

<p>In this way you can keep running automation jobs in batches until everything is done, as long as each batch takes less than three hours. This is one way to solve this constraint of Azure Automation in an straightforward way.</p>

<h2 id="flow">Flow</h2>

<p><img src="http://www.msclouddeveloper.com/content/images/2019/12/Flow_1.png" alt="Start of Flow - Manual Flow trigger">
<sub>Start of Flow - Manual Flow trigger</sub></p>

<p>With below expression I calculate the number of batches to do, this is done via integer division. Divide the total number of site collections you want to process by the batchsize. The total number of sites will have to be guessed or calculated through some other way, the trick is to estimate a larger value than the real value otherwise you wont process all sites. <br>
<code>add(div(triggerBody()['number'],triggerBody()['number_1']),1)</code></p>

<p><img src="http://www.msclouddeveloper.com/content/images/2019/12/Flow_2.png" alt="Flow continued - loop">
<sub>Flow continued - loop</sub></p>

<p>Run the flow until the index has been increased until greater than or equal to the total number of batches we calculated.</p>

<p><img src="http://www.msclouddeveloper.com/content/images/2019/12/Flow_3.png" alt="Flow continued - Run Azure Automation action">
<sub>Flow continued - Run Azure Automation action</sub></p>

<p>Here you see the Azure Automation action. This is a <em>premium</em> connector by the way. In case you use boolean parameters in you runbook then you need to perform the following trick. <br>
Instead of selecting Yes or No, use a manual parameter then use below expressions for False or True</p>

<pre><code>- int('0') : False
- int('1') : True
</code></pre>

<h2 id="azureautomationpowershellrunbook">Azure Automation PowerShell runbook</h2>

<p>Here's part of a PowerShell script that you could setup to run in a batched way. Notice the parameters $batchNo (batch number) and $batchSize <br>
In the code I get all site collections and the tenant and then using the <em>-skip</em> and <em>-first</em> actions of the <em>select</em> command I get the set of site collections to do in this batch. <br>
Where it says <strong>'PROCESS SITE HERE'</strong> you can add your code to process a single site.</p>

<p><code>param (
    [Parameter(Mandatory = $true)]
    [ValidateSet("QAS","PROD")]
    [string]
    $env,
    [Parameter(Mandatory=$true)][string]$logFileSiteUrl,
    [Parameter(Mandatory=$false)][string]$SPOAdminCredName,
    [Parameter(Mandatory=$true)][int]$batchNo = 0,
    [Parameter(Mandatory=$true)][int]$batchSize = 10,
    [Parameter(Mandatory=$true)][bool]$uploadFile,
    [Parameter(Mandatory=$true)][bool]$runLocal
)</code></p>

<p><code>$spoAdminCred = Get-AutomationPSCredential -Name $SPOAdminCredName;</code></p>

<p><code>$conn = Connect-PnPOnline -Url $tenantUrl -Credentials $spoAdminCred;
$allSiteCollections = Get-PnPTenantSite;</code></p>

<p><code>$totalNumberOfSiteCollections = $siteCollections.Length;</code></p>

<p><code>Write-Output "Total number of site collections: $totalNumberOfSiteCollections";</code></p>

<p><code>$startIndex = ($batchNo * $batchSize);</code></p>

<p><code>$siteCollections = $allSiteCollections | select -Skip $startIndex;
$siteCollections = $siteCollections | select -First $batchSize;</code></p>

<p><code>$numberOfSiteCollections = $siteCollections.Length;</code></p>

<p><code>Write-Output "Starting from site collection number $startIndex with batchsize $batchSize";</code></p>

<p><code>if ($siteCollections -and $siteCollections.Length -gt 0)
{
    $aIndex = 0;</code></p>

<p><code>foreach ($aSiteCollection in $siteCollections)
    {
        Write-Output "Starting with site number $aIndex of $numberOfSiteCollections";</code></p>

<p><code>#PROCESS SITE HERE
        $aIndex++;
    }</code></p>

<p><code>if ($uploadFile)
    {
        Write-Output "Uploading $logPath to $logFileSiteUrl";
        UploadLog -siteLocation $logFileSiteUrl;
    }
    else
    {
        Write-Output "Uploading file $logPath is NOT enabled.";
    }</code>
<code>
 }</code></p>]]></content:encoded></item></channel></rss>