Introduction
I’ve recently blogged about Provisioning Windows Autopilot devices to get the encrypted with Bitlocker at the factory to speed up compliance. You can review those blog posts below:
- Encrypting devices during Windows Autopilot provisioning (WhiteGlove) – Part 1
- Encrypting devices during Windows Autopilot provisioning (WhiteGlove) – Part 2
- Encrypting devices during Windows Autopilot provisioning (WhiteGlove) – Part 3
In this post I’ll share a PowerShell script to allow you to set the group tag of 1 or multiple devices easily. This script is loosely based on the following script from . That was a great script but we wanted the ability to set different group tags on just one device or multiple, and not necessarily ALL devices.
This script will install the necessary modules and prompt you if you want to set the group tag on one or multiple devices. You can also use it to remove the group tag on one or multiple devices.
Below are some sample screenshots:
You’ll be guided through the operation, and output shown on screen to update you about what is happening

Bulk setting group tags…

After running the script…

That’s it !
the list of computers needs each computer serial number one line at a time, like so:
011550254253
1081-6982-6349-2136-8315-2402-07
4578-6543-2457-8579-1500-3859-77
4621-1808-2177-3149-8347-3576-45
5CG03729P0
6108-0964-0068-7120-9634-7790-69
8231-8723-6986-5976-8265-3030-55
8489-6787-9087-7850-7724-7698-89
8753-4349-4646-8216-2852-0046-78
9945-6065-8053-0759-7695-2914-40
BHPR9W1
R90NNCWQ
here’s the script
# script to set the group tag on one or more devices
# niall brady 2023/03/17
# version 0.01 2023/03/17 Script creation
# version 0.02 2023/03/22 adding bulk logic to read serials from csv
function Select-GroupTag {
do
{
Write-Host "Select the Group Tag you want to use:" `r`r
Write-host "1. GroupTag1 `n2. GroupTag2 `n3. GroupTag3 `n4. Remove Group Tag"
$menuresponse = read-host [Enter Selection]
Switch ($menuresponse) {
"1" {$Global:newGroupTag = "GroupTag1"
Write-host "Group tag will be set to: "$Global:newGroupTag
write-host "`n"}
"2" {$Global:newGroupTag = "GroupTag2"
Write-host "Group tag will be set to: "$Global:newGroupTag
write-host "`n"}
"3" {$Global:newGroupTag = "GroupTag3"
Write-host "Group tag will be set to: "$Global:newGroupTag
write-host "`n"}
"4" {$Global:newGroupTag = ""
Write-host "Group tag will be set to: "$Global:newGroupTag
write-host "`n"}
}
}
until (1..4 -contains $menuresponse)
}
function Select-ImportType {
do
{
Write-Host "Select the import type:" `r`r
Write-host "1. Single computer `n2. Multiple computers"
$menuresponse = read-host [Enter Selection]
Switch ($menuresponse) {
"1" {$Global:ImportType = "Single"
Write-host "Group tag will be set to: "$Global:ImportType
write-host "`n"}
"2" {$Global:ImportType = "Multiple"
Write-host "Group tag will be set to: "$Global:ImportType
write-host "`n"}
}
}
until (1..2 -contains $menuresponse)
}
function YesNo {
Do {
#[System.Console]::CursorTop = $Cursor
#Clear-Host
$Answer = Read-Host -Prompt 'Set the group tag (y/n)'
}
Until ($Answer -eq 'y' -or $Answer -eq 'n')
$Global:Answer = $Answer
}
function get-serial{$global:serialnumber= Read-Host -Prompt "Enter the serial number that you want to set the Group tag on..."
$global:serialnumber = $global:serialnumber.ToUpper()}
#########################################################################################################################################
$script = "Set-GroupTag"
$version = "0.02"
$importpath = "C:\dev\bulk import\list of computers.txt"
write-host "Starting script '$script' version '$version'."
write-host "`nPlease note: If you want to set the group tag of multiple computers, add them to the following text file one SERIAL number per line: '$importpath'`n"
if (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')){
write-host "User has correct permissions.. continuing."}
else
{write-host "Please run this script as a user with local Administrator permissions."
break}
# script magic starts here
write-host "Please wait, installing Graph..."
Install-Module -name Microsoft.Graph.Intune -Scope AllUsers
#Connect-MgGraph -TenantId "yourTenant GUID"
write-host "Connecting to Graph..."
Connect-MSGraph
write-host "Updating Graph..."
Update-MSGraphEnvironment -SchemaVersion "Beta" -Quiet
Connect-MSGraph -Quiet
$selecteddevice = $null
Select-GroupTag
Select-ImportType
#write-host "'$Global:ImportType'"
write-host "reading current group tag values, please wait..."
# Get all autopilot devices (even if more than 1000)
$autopilotDevices = Invoke-MSGraphRequest -HttpMethod GET -Url "deviceManagement/windowsAutopilotDeviceIdentities" | Get-MSGraphAllPages
If ($Global:ImportType -eq "Single"){
# get specific device based on serial number
get-serial
#$global:serialnumber = "5CG1081VHY"
write-host "you entered: $global:serialnumber"
$selecteddevice = $autopilotDevices | Where-Object { $_.serialNumber -eq $global:serialnumber }
#$autopilotDevices.serialNumber | -Match $global:serialnumber
#write-host $selecteddevice
if ($selecteddevice){
$Global:oldGroupTag = $selecteddevice.groupTag
write-host "Old group tag: " $Global:oldGroupTag
write-host "New group tag: " $Global:newgroupTag
# final confirmation should we set it ?
YesNo
if ($global:answer -eq "y") {write-host "The user chose to set the group tag"
$autopilotDevice = $selecteddevice
$autopilotDevice.groupTag = $Global:newgroupTag
#$autopilotDevice.orderIdentifier = "ORDER1234" | updating orderidentifier is currently not supported
$requestBody=
@"
{
groupTag: `"$($autopilotDevice.groupTag)`",
}
"@
Write-Output "Updating entity: $($autopilotDevice.id) | groupTag: $($autopilotDevice.groupTag) | orderIdentifier: $($autopilotDevice.orderIdentifier)"
Invoke-MSGraphRequest -HttpMethod POST -Content $requestBody -Url "deviceManagement/windowsAutopilotDeviceIdentities/$($autopilotDevice.id)/UpdateDeviceProperties"
#}
# Invoke an autopilot service sync
Invoke-MSGraphRequest -HttpMethod POST -Url "deviceManagement/windowsAutopilotSettings/sync"
}
else
{write-host "The user chose to cancel setting the group tag"}
}
else {write-host "that serial number was not found in Windows Autopilot devices"}
}
If ($Global:ImportType -eq "Multiple"){
$ComputersArray = Get-Content $importpath
# final confirmation should we set it ?
write-host "`nNote: You are about to set the group tag of all the computers in the list, you will only be prompted once !`n"
YesNo
write-host "`n"
ForEach ($Computer in $ComputersArray) {
$global:serialnumber = $Computer
write-host "Bulk set: $global:serialnumber"
$selecteddevice = $autopilotDevices | Where-Object { $_.serialNumber -eq $global:serialnumber }
#$autopilotDevices.serialNumber | -Match $global:serialnumber
#write-host $selecteddevice
if ($selecteddevice){
$Global:oldGroupTag = $selecteddevice.groupTag
write-host "Old group tag: " $Global:oldGroupTag
write-host "New group tag: " $Global:newgroupTag
if ($global:answer -eq "y") {write-host "The user chose to set the group tag"
$autopilotDevice = $selecteddevice
$autopilotDevice.groupTag = $Global:newgroupTag
#$autopilotDevice.orderIdentifier = "ORDER1234" | updating orderidentifier is currently not supported
$requestBody=
@"
{
groupTag: `"$($autopilotDevice.groupTag)`",
}
"@
Write-Output "Updating entity: $($autopilotDevice.id) | groupTag: $($autopilotDevice.groupTag) | orderIdentifier: $($autopilotDevice.orderIdentifier)"
Invoke-MSGraphRequest -HttpMethod POST -Content $requestBody -Url "deviceManagement/windowsAutopilotDeviceIdentities/$($autopilotDevice.id)/UpdateDeviceProperties"
#}
}
else
{write-host "The user chose to cancel setting the group tag"}
}
else {write-host "that serial number was not found in Windows Autopilot devices"}
}
# Invoke an autopilot service sync
Invoke-MSGraphRequest -HttpMethod POST -Url "deviceManagement/windowsAutopilotSettings/sync"
}
write-host "all done!, exiting script."
until next time, see you then
Update: you can download an updated version of this script (with logging) from Thiago’s Github here

Sorry, I’m a Powershell NOOB. Is it possible to automate a script that regularly checks all the autopilot devices and assigns a Group Tag to the device if that device doesn’t currently have one. The alternative would to receive an email if a device appears in autopilot without a group tag, so we are notified its there and can assign the group tag manually.
We use group tags to apply loads of standard config to Intune enrolled devices.
We frequently encounter the scenario where we buy a new laptop which is autopiloted by the manufacturer and it doesn’t appear on Intune until the day it arrives at the user. The user switches it on and start configuring it before we’ve assigned the group tag, so the device misses out on the config and we end up having to manually fix issues.