Windows 10 internal rings & WMI branding

Windows-as-a-service (WaaS) requires a stable process for testing feature updates. You don’t want to discuss all over again, who is involved in testing what applications multiple times a year. But once you have the process in place it should be used for testing all changes: new or updated standard applications, software updates or settings. Continued testing creates routine for IT and end-users.
Resources used in testing should be identifiable in Configuration Manger and GPO. Branding internal rings in WMI allows to import the branding in Configuration Manager via Hardware Inventory and to use WMI filter to apply different settings via GPO.
In this showcase three internal rings are defined:

  • Insider
    • IT EUC internal users
      • To run tests on standard applications and settings
  • Early Adopter (EA)
    • End-users outside IT EUC
      • To run tests in end-user daily business
  • General Availability (GA)
    • Default users
      • New standard, No tests

 

WMI class

To avoid conflicts a new WMI class is created.
The showcase creates a WMI class for MyCompany (MC):

[Static]
class MC_MyCompanySettings
{
	[key, read, write] string OS;		// to prevent multiple instances
	[read, write] string MC_Release;	// to identify the initial release used to setup the device
	[read, write] string MS_Ring;		// Microsoft release
	[read, write] string MC_Ring;		// internal ring
	[read, write] string CostCenter;	// Cost Center
	[read, write] string Setting01;		// free setting
	[read, write] string Setting02;		// free setting
	[read, write] string Setting03;		// free setting
};

PowerShell is used for all WMI operations
The scripts can be integrated in the Operating System Deployment (OSD) task sequence.

Create WMI class

$newClass = New-Object System.Management.ManagementClass("root\cimv2", [String]::Empty, $null);
$newClass["__CLASS"] = "MC_MyCompanySettings";
$newClass.Qualifiers.Add("Static", $true)
$newClass.Properties.Add("OS",[System.Management.CimType]::String, $false)
$newClass.Properties["OS"].Qualifiers.Add("Key", $true)
$newClass.Properties["OS"].Qualifiers.Add("Read", $true)
$newClass.Properties["OS"].Qualifiers.Add("Write", $true)
$newClass.Properties.Add("MC_Release",[System.Management.CimType]::String, $false)
$newClass.Properties["MC_Release"].Qualifiers.Add("Read", $true)
$newClass.Properties["MC_Release"].Qualifiers.Add("Write", $true)
$newClass.Properties.Add("MS_Ring",[System.Management.CimType]::String, $false)
$newClass.Properties["MS_Ring"].Qualifiers.Add("Read", $true)
$newClass.Properties["MS_Ring"].Qualifiers.Add("Write", $true)
$newClass.Properties.Add("MC_Ring",[System.Management.CimType]::String, $false)
$newClass.Properties["MC_Ring"].Qualifiers.Add("Read", $true)
$newClass.Properties["MC_Ring"].Qualifiers.Add("Write", $true)
$newClass.Properties.Add("CostCenter",[System.Management.CimType]::String, $false)
$newClass.Properties["CostCenter "].Qualifiers.Add("Read", $true)
$newClass.Properties["CostCenter "].Qualifiers.Add("Write", $true)
$newClass.Properties.Add("Setting01",[System.Management.CimType]::String, $false)
$newClass.Properties["Setting01"].Qualifiers.Add("Read", $true)
$newClass.Properties["Setting01"].Qualifiers.Add("Write", $true)
$newClass.Properties.Add("Setting02",[System.Management.CimType]::String, $false)
$newClass.Properties["Setting02"].Qualifiers.Add("Read", $true)
$newClass.Properties["Setting02"].Qualifiers.Add("Write", $true)
$newClass.Properties.Add("Setting03",[System.Management.CimType]::String, $false)
$newClass.Properties["Setting03"].Qualifiers.Add("Read", $true)
$newClass.Properties["Setting03"].Qualifiers.Add("Write", $true)

$newClass.Put()

Fill WMI

CostCenter is passed as parameter during Task Sequence
Param(
[string]$CostCenter
)
$OS = "Windows 10"
$MC_Release = "1607_beta02"
$MS_Ring = "CB"
$MC_Ring = "GA"
$CostCenter = $CostCenter
$Setting01 = ""
$Setting02 = ""
$Setting03 = ""
New-CimInstance -Namespace root/cimv2 -ClassName MC_MyCompanySettings -Property @{OS=$OS;MC_Release=$MC_Release;MS_ring=$MS_Ring;MC_ring=$MC_Ring;CostCenter=$CostCenter;Setting01=$Setting01;Setting02=$Setting02;Setting03=$Setting03}

Brand a machine as Early Adopter

$MC_Instance = Get-CimInstance -ClassName MC_MyCompanySettings;
Set-CimInstance -InputObject $MC_Instance -Property @{MC_Ring = "EA"} -PassThru

If this script is published as an application in the Software Center users can assign as Early Adopter themselves.
Next time GPOs are applied the machine / user will receive the EA-GPOs. Configuration Manager hardware inventory will report the new ring back to Configuration Manager, so EA-application can be offered / deployed.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s