About Magnus Sandtorv

Microsoft MVP in Office Apps & Services, Microsoft Teams Evangelist, Enterprise Mobility Professional, PowerShell automation enthusiast with my head in the cloud. Blog at Teams.rocks

Schedule a meeting in Microsoft Teams

Last time, in my post Get started with meetings in Microsoft Teams, I explained how you can spin up a quick meeting from an ongoing channel conversation. In this mini tutorial I will focus on a more traditional scenario, where the meeting is scheduled in advance.

calendar-icon.pngThere are multiple ways of scheduling Teams meetings, you could do it from within the meet now functionality covered in my last post, from the mobile apps, from the meetings app in the Microsoft Teams desktop and web apps, or using the Teams meeting add-in in Outlook.

Let’s explore meetings in the dektop and web app!

DayView.png

When you click the Meetings button in the left menu it opens the day view, where you will find any meetings or appointments scheduled in Teams or Outlook. You also have the option to switch to the agenda view in the upper right.

agendaView.jpg

You can easily join a scheduled meeting by clicking Join. If you want to explore the content, who’s invited and more details, just mark the appropriate scheduled event.

meetingDetails.png

To schedule a new meeting, click the Schedule a meeting button below the day or agenda view.

scheduleMeeting.png

Depending on your configuration you will be able choose between a new live event (preview) or a new meeting.

meetingScheduler.png

You can obviously give the meeting a title, choose the time and date and add some details, you could choose to book a physical meeting room, there’s an option to select a channel to virtually host the meeting as well as a scheduling assistant that will compare the calendars of those invited to find a suitable time.

If you choose to host the meeting in a channel members of the team will be able to join.

Once you hit Schedule in the lower right corner the invitation is sent, and the meeting details will open.

meetingScheduled.png

In the lower left you will see the link to the meeting, and depending on your license maybe also a toll free number to call the meeting as well as a conference ID.

Prefer video? Check out Microsofts great 90 second video tutorial on scheduling meetings.

That’s all I have for now, stay tuned for more mini tutorials, next up is scheduling Teams meetings using the Teams meeting add-in in Outlook.

Get started with meetings in Microsoft Teams

This is the first, of what will hopefully be a series of new mini tutorials, explaining simple concepts and features in Microsoft Teams.

The first topic is meetings, I will not cover every aspect of meetings in Teams, or Microsofts vision of Intelligent Meetings, but I will start with showing you how you can quickly spin up a meeting in a channel, using functionality commonly refered to as Meet Now.

MeetNowTop.jpg

Let’s say you work in management of a business school, within your team you have a channel called Insights, and a colleague recently added a beautiful Power BI Dashboard to track things like retention and graduation rates.

BusinessSchoolConversation.jpg

There is an ongoing discussion about these insights in the conversation tab, but you feel like kicking of a quick meeting to go more in depth. Just hit the meet now icon in context of the conversation!

MeetNow.png

A video preview will launch, and you will have the option to add a subject, turn video on or off, switch to another camera or open the meeting scheduler if you deside to pick this up at a later time.

MeetNowStarts.jpg

If you hit the Meet Now button the meeting will start, you will see the others from the conversation in the participant pane on the right, and you can click any name to have the meeting call that person.

MeetNowAlone.png

You can add any team member to the meeting using either suggestions or search in the participant pane.

Depending on your configuration you will have lots of options available for things like recording or desktop sharing, but let’s save those for an upcoming mini tutorial.

Adding apps & tabs in Microsoft Teams using Graph – part 1

In part one of this two part tutorial I will show you how to add tabs within your channels in Microsoft Teams, using the Graph APIs. In part two I will also cover how you can automate the procedure using PowerShell, allowing for scenarios where you need to bulk add tabs to a large set of teams.

microsoft_graph

Microsoft Graph

First things first, what is Graph? Microsoft Graph is the gateway to data and intelligence in Microsoft 365, and allow applications to access digital work and digital life data across the intelligent Microsoft cloud (Source: Microsoft).

Sound great, but what does it really mean? In short it’s a set of REST APIs we can connect to in order to programatically interact with services within Microsoft 365, whether it’s to get meetings and calendar data from Exchange, mobile device status from Intune or feedback and grades from assignments in Microsoft Teams for Education.

Technically Microsoft has multiple Graph APIs, or endpoints, like the Intelligent Security Graph, the education API, Office Graph and more, but we can easily interact with them simultaneously, as well as use data from one in the other, so lets refer to Microsoft Graph as an entity going forward.

Like the title says, we’re going to focus on adding tabs within Teams today, a feature, or possibility if you will, announced at Microsoft Ignite 2018.

 

Who needs to add tabs programatically?

In many if not most cases, teams are setup and managed largely by team owners. But there are organizations that combine tools like Forms or PowerApps with Flow, in order to govern the team creation process using a request form. Others bulk create teams using the Microsoft Teams PowerShell module, and sectors like education have tools like School Data Sync to automate the teams lifecycle.

In those scenarios the team is created for the owner, often pre-populated with relevant members, and we might like to prepare it with a set of predefined channels, apps and tabs.

 

Getting the IDs

Microsoft love IDs, whether they’re called globalIDs, groupIDs or teamsAppIDs, and I’m sure also great ideas.

In order to add a tab, we first need to get the teams ID, the channel ID, and we need some info about the tab we’re adding. A great way to get started with Graph is using the Graph Explorer, so lets use that and see if we can find some of those IDs.

You must first login to the service, then modify the permissions (either according to the documentation or just add everything), and finally choose beta.

Graph_logon.png

This worked at the time of writing, but since these APIs are still in beta there might have been changes by the time you read this and they might have been moved into production (v1.0).

 

Lets first run a GET to see if the logged on user has any team memberships.

GET https://graph.microsoft.com/beta/me/joinedTeams

Response:
{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#groups",
    "value": [
        {
            "id": "74bacc8d-dd90-4b5a-aba2-72cf9c044eea",
            "displayName": "GraphTeam",
            "description": "GraphTeam",
            "isArchived": false
        }
    ]
}

 

We can see this particular user is a member of one team caled GraphTeam, and we also get the teams ID. Lets use that and see if there are any channels in that team.

GET https://graph.microsoft.com/beta/teams/74bacc8d-dd90-4b5a-aba2-72cf9c044eea/channels/

Response:
{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#teams('74bacc8d-dd90-4b5a-aba2-72cf9c044eea')/channels",
    "value": [
        {
            "id": "19:3244b3fd6f8a42d390a79706b68678f1@thread.skype",
            "displayName": "General",
            "description": null
        },
        {
            "id": "19:d6789651b4704d2db79c9f76a13009c2@thread.skype",
            "displayName": "Channel1",
            "description": null
        }
    ]
}

 

You can see the ID was added to the query, as well as /channels/ since that is what we’re after, and we get two channels in return; General and Channel1. Again we’re getting the IDs, let’s choose General and see if we can query for tabs.

GET https://graph.microsoft.com/beta/teams/74bacc8d-dd90-4b5a-aba2-72cf9c044eea/channels/19:3244b3fd6f8a42d390a79706b68678f1@thread.skype/tabs

Response:
{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#teams('74bacc8d-dd90-4b5a-aba2-72cf9c044eea')/channels('19%3A3244b3fd6f8a42d390a79706b68678f1%40thread.skype')/tabs",
    "value": [
        {
            "id": "0d042444-0c01-4fbd-afb8-2f936f7ba751",
            "name": "Wiki",
            "teamsAppId": "com.microsoft.teamspace.tab.wiki",
            "sortOrderIndex": "10000",
            "webUrl": "https://teams.microsoft.com/l/channel/19%3a3244b3fd6f8a42d390a79706b68678f1%40thread.skype/tab%3a%3a3accd260-ec69-43c8-8130-3908c1fbe02d?label=Wiki&groupId=74bacc8d-dd90-4b5a-aba2-72cf9c044eea&tenantId=6ac1a27f-51d8-47e6-8485-5ee4f0e58fee",
            "configuration": {
                "entityId": null,
                "contentUrl": null,
                "removeUrl": null,
                "websiteUrl": null,
                "wikiTabId": 1,
                "wikiDefaultTab": true,
                "hasContent": false
            }
        }
    ]
}

 

From the look of it we have one tab, this is obviously not right since all channels have at least one tab for Conversations and one called Files.

GraphTeam_tabs.png

The query does however list all tabs that we are able to edit, which makes sense.

The tab that was returned was a Wiki tab, and what is the first thing we do with the Wiki tab? We replace it with a OneNote tab! So let’s remove it by adding the tab ID to the query and changing from GET to DELETE.

DELETE https://graph.microsoft.com/beta/teams/74bacc8d-dd90-4b5a-aba2-72cf9c044eea/channels/19:3244b3fd6f8a42d390a79706b68678f1@thread.skype/tabs/0d042444-0c01-4fbd-afb8-2f936f7ba751

 

It doesn’t return anything, but we can clearly see that the Wiki tab has been removed.

GraphTeam_tabs_noWiki.png

 

To learn how to construct the object when creating a tab there are examples in the API reference documents. You can also get information querying for existing tabs, I have added a website tab, lets see what that looks like.

GET https://graph.microsoft.com/beta/teams/74bacc8d-dd90-4b5a-aba2-72cf9c044eea/channels/19:3244b3fd6f8a42d390a79706b68678f1@thread.skype/tabs

Response:
{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#teams('74bacc8d-dd90-4b5a-aba2-72cf9c044eea')/channels('19%3A3244b3fd6f8a42d390a79706b68678f1%40thread.skype')/tabs",
    "value": [
        {
            "id": "862ba9d9-9e68-48ad-a0b8-5ca4ac637c55",
            "name": "Teams.rocks",
            "teamsAppId": "com.microsoft.teamspace.tab.web",
            "sortOrderIndex": "10100",
            "webUrl": "https://teams.microsoft.com/l/channel/19%3a3244b3fd6f8a42d390a79706b68678f1%40thread.skype/tab%3a%3a577a969c-9d7b-4ef5-bb2e-35d8086a3be5?webUrl=https%3a%2f%2fTeams.rocks&label=Teams.rocks&groupId=74bacc8d-dd90-4b5a-aba2-72cf9c044eea&tenantId=6ac1a27f-51d8-47e6-8485-5ee4f0e58fee",
            "configuration": {
                "entityId": "",
                "contentUrl": "https://Teams.rocks",
                "removeUrl": "",
                "websiteUrl": "https://Teams.rocks"
            }
        }
    ]
}

 

Lets also have a look at the example from the API references.

POST https://graph.microsoft.com/beta/teams/{id}/channels/{id}/tabs

{
  "name": "My Contoso Tab",
  "teamsAppId": "06805b9e-77e3-4b93-ac81-525eb87513b8",
  "configuration": {
    "entityId": "2DCA2E6C7A10415CAF6B8AB6661B3154",
    "contentUrl": "https://www.contoso.com/Orders/2DCA2E6C7A10415CAF6B8AB6661B3154/tabView",
    "websiteUrl": "https://www.contoso.com/Orders/2DCA2E6C7A10415CAF6B8AB6661B3154",
    "removeUrl": "https://www.contoso.com/Orders/2DCA2E6C7A10415CAF6B8AB6661B3154/uninstallTab"
  }
}

 

We’re going to need to give the tab a name, reference the correct teamsAppId and provide a URL.

POST https://graph.microsoft.com/beta/teams/74bacc8d-dd90-4b5a-aba2-72cf9c044eea/channels/19:3244b3fd6f8a42d390a79706b68678f1@thread.skype/tabs

Request body:

{
  "name": "Teams.rocks",
  "teamsAppId": "com.microsoft.teamspace.tab.web",
  "configuration": {
    "entityId": "2DCA2E6C7A10415CAF6B8AB6661B3154",
    "contentUrl": "https://Teams.rocks",
    "websiteUrl": "https://Teams.rocks",
    "removeUrl": ""
  }
}

 

There you go, a new website tab called Teams.rocks pointing at https://Teams.rocks.

Teams.rocks-website-tab.png

 

What about apps?

To add a tab for an app we need to first add the app itself to the team. In this example I will continue along the education scenario, which actually fits very well since schools need to provision a large amount of teams every summer and often have a requirement to have the same set of tabs in every team.

In order to get the necessary information we repeat the procedure from earlier: add the app to a team and run a GET querying apps. When we’ve got the teamsAppId, all we need to do is run a POST with with the teamsAppId in the request body.

POST https://graph.microsoft.com/beta/teams/74bacc8d-dd90-4b5a-aba2-72cf9c044eea/apps

Request body:

{
  "id": "95bab789-a64a-4cbf-a83e-70b7a7b06193"
}

 

We can see the Skooler app was added to the team by the user logged on to Graph Explorer.

Added_Skooler.png

 

Next we need to add the corresponding tab in the appropriate channel.

POST https://graph.microsoft.com/beta/teams/74bacc8d-dd90-4b5a-aba2-72cf9c044eea/channels/19:3244b3fd6f8a42d390a79706b68678f1@thread.skype/tabs

Request body:
{
  "name": "Skooler",
  "teamsAppId": "95bab789-a64a-4cbf-a83e-70b7a7b06193",
  "configuration": {
    "entityId": "",
    "contentUrl": "https://example_app_url.azurewebsites.net/",
    "websiteUrl": "",
    "removeUrl": ""
  }
}

Response:

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#teams('74bacc8d-dd90-4b5a-aba2-72cf9c044eea')/channels('19%3A3244b3fd6f8a42d390a79706b68678f1%40thread.skype')/tabs/$entity",
    "id": "c697cf16-41f2-478f-8198-3610bb530208",
    "name": "Skooler",
    "teamsAppId": "95bab789-a64a-4cbf-a83e-70b7a7b06193",
    "sortOrderIndex": "10100",
    "webUrl": "https://teams.microsoft.com/l/channel/19%3a3244b3fd6f8a42d390a79706b68678f1%40thread.skype/tab%3a%3a94876f30-ecce-4476-b1a4-0bbfc8aa2f51?label=Skooler&groupId=74bacc8d-dd90-4b5a-aba2-72cf9c044eea&tenantId=6ac1a27f-51d8-47e6-8485-5ee4f0e58fee",
    "configuration": {
        "entityId": "",
        "contentUrl": "https://example_app_url.azurewebsites.net/",
        "removeUrl": "",
        "websiteUrl": ""
    }
}

 

The Skooler app is now available as a tab within the General channel.

Skooler_app.png

Stay tuned for more in part two of this series, where you will learn how to combine what you learned above with a bit of PowerShell automation magic to add apps and tabs as part of a team creation process as well as in bulk to a set of existing teams.

Parent access in Microsoft Teams for Education

Parent access isn’t very prominent within Microsoft Teams for Education today, but there are ways to include them, one of which is  parent and guardian links in OneNote Class Notebook. In this post I will show you how to enable parent and guardian links in a class notebook part of a class team in Microsoft Teams.

Parents

Back in April 2017, the OneNote team announced read-only parent or guardian access in OneNote Class Notebook. Shortly after Microsoft Teams for Education was announced, and while class teams do include a class notebook, it’s stored in SharePoint, which require us to make some preparations before we can start sharing.

Disclaimer: While the content of this blog post was accurate at the time of writing September 22nd 2018, things change fast in the world of Microsoft Teams, so things might be different by the time you read this.

Let’s dive right in by first opening the class notebook within the class team, then choose Open in OneNote followed by Open in OneNote Online.

OpenInOneNoteOnline

The class notebook opens in the browser, we choose the Class Notebook tab followed by Manage Notebooks.

Manage_Notebooks

Choose Parent and guardian links

Notebook-links.png

Choose All students

ParentLinksAllStudents.png

Ouch! That doesn’t look good…

Error.png

The reason Parent Notebook Links can’t be generated is that the SharePoint site hosting the notebook doesn’t allow for anonymous sharing.

By default the teams underlying SharePoint site has the setting SharingCapability set to ExternalUserSharingOnly. To be able to create Parent Notebook Links it needs to be set to ExternalUserAndGuestSharing.

Luckily that’s easy, just get the site url…

GetSPSiteURL.png

and run the following PowerShell oneliner:

set-sposite -identity $Siteurl -sharingcapability ExternalUserAndGuestSharing

or follow my guide Anonymous guest sharing in Teams for a full tutorial.

If you would like to enable Parent Notebook Links for all class teams, and happen to use School Data Sync, you should instead see Anonymous guest sharing in Teams part two.

You can also modify the sharing settings from within the new SharePoint Admin Center:

SPAdmin.png

Choose Anyone and hit save.

Anyone.png

 

Once that is done, and the SharingCapability is set to ExternalUserAndGuestSharing, it looks much better:

ParentLinksOK.png

Just send the individual links to parents and they’re good to go!

This is one way to involve parent when using Microsoft Teams for Education. Let’s hope that we in a not so distant future will be able to also give parents insights into Assignments, or better yet, get a complete parent portal with messages and week plans.

If you don’t want to wait, have a look at how you can supplement Microsoft Teams for Education with learning management tools from 3rd parties like Skooler. Check out my two part series Teams + Skooler, better together – part 1 and Teams + Skooler, better together – part 2.

 

365edu Copenhagen

Next month (October 24th 2018) I’ve been invited to speak at a new conference focusing on Microsoft 365 and education!

v2 Twitter Speaker Template Denmark Magnus (2).png

365edu is a conference for teachers by teachers and education experts, and their ambition is to improve teaching and learning through the effective use of technology.

Sound awesome! I’ve been focusing a lot towards the education sector lately, both in terms of enterprise mobility, to ease the pain of managing student devices, apps and more, as well as on modern classroom experiences with Microsoft Teams integrated with 3rd party learning tools.

I’ll be in the Transformation Stream hosting two sessions:

#1 Move your education envrionment to the cloud with Microsoft 365

Microsoft Teams has quickly become the coolest kid in class, serving as a digital hub for teachers and students everywhere.

Together with the rest of Office 365, on Windows 10 Education devices managed by Intune, you get a complete cloud environment in an affordable bundle.

During this presentation you will see how you can support student devices from cradle to the grave with Autopilot and Intune, and get a demo of automatic creation of class teams, complete with teacher and students using School Data Sync. You will also learn how you can utilize student data, like grade and graduation year, to automate anything from deployment of applications to automatic redeployment of Windows 10 devices end of year.

#2 Teams and Transformation of the organization

How Horten municipality developed a platform for collaboration & learning with Microsoft Teams and 3rd party learning tools!

Todays classroom isn’t limited to the time teachers and students spend together in the classroom.  In todays tech-ready classroom, schools can get a digital classroom, a hub for collaboration and learning, through combining Microsoft Teams with integrated learning tools available from 3rd parties. 

I’ll will briefly touch on what Microsoft Teams is, then walk you through our journey migrating from documents in local file shares, a legacy learning management system, and show you how we use Microsoft Teams and integrated 3rd party learning tools for sharing, collaborating and learning, while at the same time including parents with weekly plans, absence, assessments, messages and much more!

Microsoft 365 automation using SDS attributes, Intune & Graph

June 19th I had the pleasure of talking about how to move your education environment to the cloud with Microsoft 365, at Experts Live Netherlands. In this post I will discuss some of the examples from that talk.

EL_social_tempate_speakers_Magnus.png

Experts Live Netherlands is a conference held in Ede, Netherlands, with more than a thousand attendees. For me this was a first, I had never before spoken at such a large conference, neither outside Norway.

OnStage2.png

I obviously spoke about Teams, and how to automate using School Data Sync which I have blogged about before, but also on modern management with Autopilot and Intune, and how to utilize extension attributes from SDS to automate anything from application delivery to redeployment of Windows 10 devices.

 

School Data Sync

To recap, School Data Sync is a free service in Office 365 Education. It takes data about Students, teachers, class rosters and more, from the Student Information System, and use that data to create and license users in Azure Active Directory and Microsoft 365, create classes in Microsoft Teams, complete with teachers and students, and more.

2018-03-29 16_29_15-Welcome to the 2018 Learn Teams Conference.pptx - PowerPoint

School Data Sync also lets you get grades and graduation year from the Student Information System, which you could then use to assign apps dynamically, automate archiving of classes End Of Year and to trigger Autopilot Reset.

2018-06-23 14_16_01-Task Switching.png

I won’t go through the details of setting up SDS, since I already covered that in a previous post, but you can see above what properties are available. In the upcoming examples we will need Grade and Graduation Year.

Autopilot

Autopilot is a set of technologies designed to get Windows 10 devices quickly into a secure and managed state, as well as reset, repurpose or recover them when needed.

Those who manage Apple iOS devices will notice there are many similarities to the Apple Device Enrollment Program (DEP).

Microsoft-365-powered-device-Windows-Autopilot-Deployment.png

To get devices into Autopilot we need the hardware vendor or distributor to provide or upload the hardware IDs, and we need to assign a deployment profile.

Within the Device Management portal in Azure we go to Device Enrollment followed by Windows Enrollment and Deployment Profiles.

We click Create profile, give it a name and choose a deployment mode, User-Driven in this case, specify that it should be joined to Azure AD, hide the EULA and Privacy Settings to ease the setup process for the user, and set the User account type to Standard.

2018-06-23 14_40_43-Task Switching.png

 

We assign the profile to a group of users and we’re good to go.

Vendor or distributor ship the device directly to the school, the student unboxes the device and gets a customized Out Of Box Experience.

They need to choose a region and pick a keyboard layout, as well as choose the appropriate Wi-Fi network.

Windows will then fetch the latest updates for the OOBE experience, and query the Autopilot service to get the configuration we just created.

2018-06-04 17_20_00-Remote Desktop Manager [hyperv].png

Company branding has been applied even before the student logs on, ensuring a sense of familiarity.

After logon the device starts configuring, and since we’re licensed and setup with Microsoft 365 A3 it will auto-enroll into Intune and get any configuration profiles, compliance policies and apps pushed down.

Auto-enrollment requires Azure AD Premium as well as a Mobile Device Management service like Intune (part of EMS and Microsoft 365 SKUs like A3, A5 etc.)

 

Dynamic application delivery

By now the device is enrolled and managed with Intune, and apps are installing, but students in the first grade most likely need different apps than students in the 7th grade?

So let’s find the extension attributes available from SDS, and create dynamic groups for app association. Relevant attributes can be found with the format: extension_appId_attribute name, and the appId for SDS is fe2174665583431c953114ff7268b7b3.

We need to connect to Azure AD using the preview module, then search for a user and have a look at the extension attributes.

Get-AzureADUser -SearchString student@teams.rocks | select -ExpandProperty ExtensionProperty

2018-06-25 17_31_35-Task Switching.png

You can see we have attributes like GraduationYear and Grade, as well as ObjectType to distinguish between students and teachers.

Let’s add all our users to a variable and then create a custom object to show only what is relevant.

# add users to variable
$users = Get-AzureADUser

# create a custom object and list users, grade and role
foreach ($user in $users) {
$user | select –Property @{n = 'Name'; e = {$_.DisplayName}},
@{n = 'Role'; e = {$_.ExtensionProperty.'extension_fe2174665583431c953114ff7268b7b3_Education_ObjectType'}},
@{n = 'Grade'; e = {$_.ExtensionProperty.'extension_fe2174665583431c953114ff7268b7b3_Education_Grade'}},
@{n = 'GraduationYear'; e = {$_.ExtensionProperty.'extension_fe2174665583431c953114ff7268b7b3_Education_GraduationYear'}}
}

 

2018-06-23 18_01_02-Task Switching.png We’ve got students from grade 7 and 8 as well as a teacher, synced using SDS. We also have the Graduation Year, which we will use later. First let’s create dynamic groups for app association.

# create dynamic group for Grade 7
New-AzureADMSGroup -DisplayName "Grade 7" -MailEnabled $false -MailNickname "Grade7" -SecurityEnabled $True -GroupTypes DynamicMembership -MembershipRule "(user.extension_fe2174665583431c953114ff7268b7b3_Education_Grade -eq ""7"")" -MembershipRuleProcessingState On

# create dynamic group for Grade 8
New-AzureADMSGroup -DisplayName "Grade 8" -MailEnabled $false -MailNickname "Grade8" -SecurityEnabled $True -GroupTypes DynamicMembership -MembershipRule "(user.extension_fe2174665583431c953114ff7268b7b3_Education_Grade -eq ""8"")" -MembershipRuleProcessingState On

# create dynamic group for Graduation Year
New-AzureADMSGroup -DisplayName "Graduates 2021" -Description "Students that graduate in year 2021" -MailEnabled $false -MailNickname "Graduates2021" -SecurityEnabled $True -GroupTypes DynamicMembership -MembershipRule "(user.extension_fe2174665583431c953114ff7268b7b3_Education_GraduationYear -eq ""2021"")" -MembershipRuleProcessingState On

We created two dynamic groups for grade 7 and 8, as well as one for Graduation Year 2021.

# list groups
Get-AzureADMSGroup | select DisplayName, GroupTypes

Let’s also list the groups.

2018-06-23 18_14_45-Task Switching.png

Use dynamic groups like Grade 7 and 8 to assign applications. Whenever there is a new school year in august, students from grade 7 will be moved into the group for grade 8 and Intune will remove apps assigned to grade 7 and add any apps, or profiles for that matter, assigned to grade 8.

 

Autopilot Reset

Windows Autopilot Reset removes personal files, apps, and settings, resetting Windows 10 while still maintaining Azure AD Join and MDM enrollment.

Microsoft first announced this with 1709 as automatic redeployment, and said remote triggering would be available in the spring. Then remote triggering was pulled from 1803, but reappeared in insider build 17672 and was announced June 7th as Autopilot Reset.

Devices will retain the region, language, and keyboard settings, and connect to Wi-Fi using the network credentials provisioned prior to the reset.

This means that we can use the group we created earlier, based on graduation year, to automatically reprovision a set of devices!

When new students arrive after the summer they can log on to a fresh device in a managed and secure state, and all Intune needs to do is push any apps or profiles unique to the user or grade.

This example utilizes the Microsoft Graph to instruct the Intune service to reset one or more devices in a certain way. I will not cover the authentication part of working with Graph, but you can find the functions used in this example in Microsofts Github repository for powershell Intune samples.

First we need to construct a payload with the wipe instructions.

# construct JSON object (body) for wipe instructions
$payload = @{
keepEnrollmentData = $true
keepUserData = $false
}
$body = $payload | ConvertTo-Json

The object will look like this:

{
"keepEnrollmentData": true,
"keepUserData": false
}

 

We will then get the users from the dynamic group we created earlier, and the Device IDs of any devices they have enrolled in Intune. We use the Device ID to construct a URI, and trigger the wipe action using the Invoke-RestMethod cmdlet pointing to that URI together with the authToken as well as the JSON payload from the last step.

$users = Get-AzureADGroup -SearchString "Graduates 2021" | Get-AzureADGroupMember
foreach ($user in $users) {

# get user id (Intune device ID is not the same as Azure AD device ID)
$id = (Get-AADUser -userPrincipalName $user.UserPrincipalName).id
# get id from device registered to user
$DeviceID = (Get-AADUserDevices -UserID $id).id
if ($DeviceID) {
# construct uri
$Resource = "deviceManagement/managedDevices/$DeviceID/wipe"
$uri = "https://graph.microsoft.com/beta/$($resource)"
# reset device
Write-Host "Performing reset on device $DeviceID" -ForegroundColor Yellow
Invoke-RestMethod -Uri $uri -Headers $authToken -Method Post -Body $body

}
else {

Write-Host "User has no registered device" -ForegroundColor Cyan
}
}

 

The URI should look like this: https://graph.microsoft.com/beta/deviceManagement/managedDevices/7345bdbf-1f17-4b59-85e7-ac2e545d776c/wipe

And this is the result in our demo environment:

2018-06-24 13_38_20-Task Switching.png

We had two students fitting the description, you can see the first one didn’t have a registered device, but the second did.

We can see from the Intune console the action automaticRedeployment is now pending (status will change to completed when the device has registered back into the service).

2018-06-24 13_39_22-Task Switching.png

 

If a user is logged on they will first receive a toast message, informing them a restart is scheduled in 45 minutes for automatic redeployment.

2018-06-24 13_41_43-Task Switching.png

35 minutes later they will get a popup message counting down, warning that Windows will shut down in 10 minutes.

2018-06-25 08_28_27-Remote Desktop Manager [hyperv].png

When the device is reset and ready for a new student they will see the message above on the login screen.

 

Needless to say, you can customize the above script to better suit you environment, maybe you need to reset all devices in a particular school or you have some other criteria.

Microsoft Graph EDU

To sum’ up, when using School Data Sync, a set of extension attributes can be made available. Combine that with the power of the Microsoft Graph, and you can automate anything from application delivery to redeployment of Windows 10 devices, freeing up valuable time for IT and educators.

#TeamsEduTurns1 with loads of new announcements!

June is great month to release new functionality in EDU tools, when school is out in large parts of the world. In this post I will introduce you to some of the latest announcements from Microsoft, and discuss what this means in education.

TeamsOneYear.png

But first, lets take a moment to reflect on the past. Teams for Education just turned one year, and what a year it has been!

Classrooms all over the world are experiencing transformation, students are given a voice, and inclusive and engaging learning environments have been created.

 

New features

Let’s have a look at some of the features announced lately.

Page locking

First up is one that I know educators have been longing for. Page locking in OneNote Class Notebook is finally rolling out. Not only that, using Teams teachers can set pages to automatically lock when the assignment hits the due date!

Rubric grading

Another common request has been for students to be able to see how they’ll be assessed upfront, before starting the assignment. With rubric criteria and skills-based grading Microsoft introduces that, while also saving teachers time allowing them to easily grade multiple assignments at once.

Rubric grading is the first feature brought to Teams for EDU with the hiring of Chalkup co-founder and CEO Justing Chando.

 

Forms in assignments

Another great addition to assignments in Microsoft Teams will be the posibility to add a Form to a new assignment. As soon as the student returns the form it can be graded automatically and the score as well as any feedback will be written back to the grade book.

 

Reuse a team as a template

Reusing an existing team as a template when creating a new one was announced a while back, let’s see what that actually looks like.

First click Join or create a team.

Join or create a team.png

Choose create team.

Create team.png

Pick a team type.TeamType.png

Give the team a name and choose Create a team using an existing team as a template.

CreateYourTeam.png

Next up you will have to choose which team to use as a template.

WhichTeamAsTemplate.png

And then choose what to bring over from the existing team.

WhatToBringOver.png

At this time you can choose to bring over channels, tabs, team settings, apps and/or members. If you need to copy files you can accomplish that from within the SharePoint document library.

 

Join codes

Join codes was also announced a while back and should be rolling out in the coming weeks. This will enable educators to easily get a group of students into the team by sending them a code.

To get the code, the teacher needs to hit the three dots (…), also known as more, followed by Manage team, and then Settings. They can then generate a code under Team code.

GenerateTeamCode.png

You will be presented with a code…

code.png

…that you can copy and send to students or other invitees.

 

Invitees will have to choose to join or create a team, followed by Join a team with a code.

Join_a_team_with_code.png

Unsuprisingly entering the code and hitting Join team will take them to the associated team.

JoinTeam.png

 

Archive teams

This is a big one. While we obviously need to automate this in larger environments, archiving teams is a welcome feature entering end of school year. This feature will according to Microsoft let you safely store your team content in read-only mode to use as a reference while setting up your Teams experience for the next school year.

Let’s have a look at how this could look, in the not so distand future.

In the Manage teams page you could get an overview of all your teams, click … (more) followed by Archive Team.

ArchiveTeamMenu.png

 

Hitting the Archive button will, well… not surprisingly archive the team.

Archive.png

All team activity will be frozen, or read-only, while you’re still able to add or remove members who might need access to team data.

Once archived you will have the option to restore or delete the team.

Archived.png

 

For more information about these lates announcements, see the Microsoft Education blog post.

 

The people behind the success

Before we move on with even more news, I would like to both congratulate and give thanks to some of the people behind this amazing product.

TeamsTeam.png

This is a picture of the Teams for Education team shared on Twitter,  (hope it’s OK that I use it). Happy one year anniversary and keep up the excellent work, Teams rocks!

 

Uservoice

Last but not least I thought I would update you on some of the latest updates coming from Uservoice. For those who are not familiar with Uservoice, it’s a product feedback platform that allow Microsoft and others to prioritize feature requests and gain insights into customers wishes and requirements.

You can either vote for an idea or feature request or you can submit your own if your request doesn’t match one already registered.

Microsoft Teams in general has a uservoice at microsoftteams.uservoice.com, and there is a collection of education related uservoice sites at edu.uservoice.com. Microsoft Teams for Education has a dedicated UserVoice, let’s have a look at some of the recent updates.

It is important to know that even though a feature request could be tagged with ie. plannedworking on it or partially done, Microsoft does not give any guarantees as to if and when it will actually surface within the product.

 

Integrate Assignments with calendar

2018-06-06 09_26_27-Innboks - Magnus.Sandtorv@horten.kommune.no - Outlook.png

This feature will insert assignments info into students Outlook calendars, effectively enabling them to easily see whats due when.

 

Add ability for Parents/Gaurdians to view assignments, etc.

2018-06-06 09_30_17-Innboks - Magnus.Sandtorv@horten.kommune.no - Outlook.png

Parent insights is crucial and while I would prefer a more comprehensive parent portal a weekly email digest is certainly a welcome addition.

Those who require more learning tools integrated with Teams, such as a parent portal or an app with attendance, week plans and more, can get this today with 3rd party tools like Skooler.

 

Bring the waffle menu into teams online experience

2018-06-06 09_39_07-Innboks - Magnus.Sandtorv@horten.kommune.no - Outlook.png

While not a big thing, easy access to other tools in Office 365 is good for usability.2018-06-06 09_40_55-(2) Chat _ Microsoft Teams.png

2018-06-06 09_43_39-(4) General (Åsgården skole) _ Microsoft Teams.png

The waffle will only be available while using Teams in the browser.

 

Ability to prevent students from editing files

2018-06-06 09_45_19-Innboks - Magnus.Sandtorv@horten.kommune.no - Outlook.png

Making sure students don’t remove their homework from the week plan or accidentaly remove important information from within a document shared in the team has been a top request by teachers since the release of Teams for Education, and it now looks like it’s finally coming.

Teachers could accomplish something similar today by adding files or folders from an external SharePoint document library, where permissions are separate from those within the team. It is however a cumbersome process so baking this into Teams makes perfect sense.

 

Different assessment grade/points formats

2018-06-06 09_51_11-Innboks - Magnus.Sandtorv@horten.kommune.no - Outlook.png

Custom grading like pass, fail etc. is also something that teachers have been requesting for some time.

 

Make sure to follow the uservoice links to vote, and leave your email address if you would like to be updated with any changes in status going forward.

 

That is all for now, If you like my work please share in social media and or in the comments below.