Monday, May 27, 2019

European Collaboration Summit (ECS) 2019 - Tutorial - Recap

Today I've had the great opportunity to attend a very informative and well held full day tutorial at ECS which was about "SOUP TO NUTS: MICROSOFT AZURE POWERCLASS". Mustafa Toroman and Saลกa Kranjac did a really good job giving attendees a broad overview of different Azure services. I've been working with Azure since 2014 and boy I can ensure you that I've learned a lot today about it :)

I did a couple of notes during the tutorial that I'd like to share with the community. Here they are:

• Set up availability options for Azure Virtual Machine because of data security
    - Availability Set => separated infrastructure
    - Availability Zone => Different locations
• Azure Hybrid Benefits => Reuse existing licenses to save money
• Prices are different depending on the Azure location
• Azure VM disks:
    - Standard disks (HDD): only pay for the used space
    - Premium disks (SSD): you pay for the amount of disks you've reserved
• Choose from static or dynamic IP address when working with VM. By default, dynamic is selected
• Azure Stack starts from 250.000 euros. On top you must pay the consumed services ๐Ÿ˜Š
• Option "Allow access to Azure services" only guarantees that requests are from Azure data centers
• Azure Log Analytics has been renamed to Azure Monitor
• DevOps Model
    - Plan
    - Develop + Test
    - Release
    - Monitor + Learn
• Continuous Delivery => Automate the process all away through
• Continuous Deployment => Human interaction is required
• Security strategy in Azure:
    - Just enough administration => Users get only the enough permission to execute jobs
    - Just in time administration => Users get access only for a period of time
• KeyVault is great => Just use it
• O365 tenants (it also applies to other environments) should have at least two global administrators
• Just In time access for VM => Allows user to have access to an Azure VM just for a period of time
Azure data center locations
Speaker's public repository containing Azure samples

Thanks Mustafa Toroman and Saลกa Kranjac for the shared knowledge, the jokes and the answered questions ๐Ÿ˜Š

I'm really looking forward for tomorrow. There are so many interesting sessions to attend. It's going to be one of those days that passes very quickly.

See you tomorrow ๐Ÿ˜‰

Tuesday, May 21, 2019

Attending the European Collaboration Summit (ECS) 2019

I'm looking forward to attending the European Collaboration Summit in Wiesbaden from 27th to 29th May 2019.

The ECS 2018 was really good! I am curious to see what this year will be like. In any event, the ECS is a great event that brings the Office 365 community together.

Have you already seen the speakers list? Not yet? Then go ahead and be impressed: There are so many Office 365 professionals (including me ๐Ÿ™‚) attending the ECS. What's about you? Let's get in touch if you're also going to participate in this event!!! Since my company, Solutions2Share, is sponsoring this event, you can find me at our exhibition stand. Just drop by ๐Ÿ˜‰

Here my short agenda for the ECS:

26th May: Arriving at the Hotel
27th May: Attending the tutorial "SOUP TO NUTS: MICROSOFT AZURE POWERCLASS"
28th May: Attending the keynote and different sessions. Also, I'll be helping my company at the exhibition stand
29th May: Attending different sessions and helping my company at the exhibition stand

Monday, May 13, 2019

Provision existing list to other SharePoint site collections using Site Designs

Sometimes users just want to copy one piece of their site collections to other site collections. Site Designs offers you the possibility to provision an existing SharePoint list to another SharePoint site collection even in another Office 365 tenant. In this blog post, I’ll demonstrate a PowerShell-Script you can use to reach this goal. In addition. I’ll explain what is supported during provisioning.

The PowerShell command Get-SPOSiteScriptFromList makes it possible to extract an existing SharePoint list as a valid Site Script. As you already know from my other blog posts about Site Designs and Site Scripts, a Site Script is the foundation for further provisioning steps using Site Designs. In my sample scenario, a SharePoint administrator want to copy a meeting list (generic list - 100) to five other  site collections within the same Office 365 tenant. The idea here is to create SharePoint lists based on a template list which has already been set up.

Important: You may need to update your SharePoint Online Management Shell to the version 16.0. 8525.1200 or later, in order to use the demonstrated PowerShell commands below.

The PowerShell script below shows how to extract the source meeting’s list. Then it creates new Site Script and Site Design which will be temporarily used for provisioning. I used Grant-SPOSiteDesignRights to reduce the Site Design's visibility to the administrator's account only. In a foreach loop I go through the urls starting the provisioning process for each site collection using Add-SPOSiteDesignTask. Another loop takes care of checking if the Site Design task has finished for each site collection. After provisioning is complete, the Site Design and Site Script will be deleted since I want to keep the environment clean ๐Ÿ˜Š

Why did I use Add-SPOSiteDesignTask instead of Invoke-SPOSiteDesign?

On the one hand, the Invoke-SPOSiteDesign command is limited to 30 cumulative actions across one or more scripts that may be called in the Site Design. It acts as a synchronous call. On the other hand, the Add-SPOSiteDesignTask command supports up to 300 cumulative actions or 100k characters. It acts as an asynchronous call. Since the command Get-SPOSiteScriptFromList also extracts components that are associated tSCRIPTa Site
Script which contains more than 30 actions. Therefore, Add-SPOSiteDesignTask is the safest way to go!

The table below shows the main differences between the commands above:

Command Operation Supported actions
Invoke-SPOSiteDesign Synchronous 30
Add-SPOSiteDesignTask Asynchronous 300

Why is Get-SPOSiteScriptFromList a powerful functionality?

This command doesn’t limit the extraction to the source list; it also extracts components associated to the list as well. For instance, if a list has site columns, it will also extract the Site Script for these site columns. If the list is associated to the left navigation, it will extract the Site Script for the navigation association. If the list has a lookup field which points to another list, it will extract the other list as well. After running this command, you have a fully configured Site Script which you can use for further provisioning steps with Site Designs.

What can you expect in May 2019 to be extracted?

The list below shows components that are supported while extracting a Site Script from an existing list using Get-SPOSiteScriptFromList.

Component Supported?
Content Types Yes
List columns Yes
Site columns Yes
Views Yes
Link to list in Quick Launch Yes
Associated extensions No (But it seems to be a bug since Get-SPOSiteScriptFromList configures the corresponding installSolution action with the SPFx extension's clientSideComponentId. Therefore, installation fails. Fix it by replacing the clientSideComponentId with the correct app id which you can retrieve using Get-PnPApp.)
List items No
User Custom Actions No
Remote Event Receiver No
Role Assignments No
Webhooks No
Workflows No

How to provision the unsupported components as well?

PnP Core is a free site provisioning framework which you can integrate with Site Designs via Microsoft Flow and Azure Function to enlarge provisioning range. Here you find the latest PnP-Schema documentation that explains the supported components. Chris O'Brien wrote a step by step guide about connecting Site Designs with PnP using a C# Azure Function. Check out his blog post to learn how to carry out this integration.


It's common to hear that developers are strategically lazy. Site Designs are also there to support our lazy skill :) because with it you can create your SharePoint list once and replicate it depending on your needs. Less code, less frustration!