disable-duplicateAzureAdDevices.ps1

<#PSScriptInfo
 
.VERSION 1.0.1
 
.GUID a4167185-5eb8-4e61-93bc-3cf86394fc6b
 
.AUTHOR Jos Lieben
 
.COMPANYNAME Lieben Consultancy
 
.COPYRIGHT
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI https://www.lieben.nu/
 
.ICONURI
 
#>


#Requires -Module @{ModuleName = 'MSOnline'; ModuleVersion = '1.1.183.57'}


<#
 
.DESCRIPTION
 Cleans up older duplicates of Azure Device Entries with the same hardware ID (Windows only)
 
#>
 

Param(
    [Switch]$WhatIf,
    [Switch]$Force
)

#connect to MSOL
Connect-MsolOnline

#get all enabled AzureAD devices
$devices = Get-MsolDevice -All | Where-Object{$_.Enabled}
$hwIds = @{}
$duplicates=@{}

#create hashtable with all devices that have a Hardware ID
foreach($device in $devices){
    $physId = $Null
    foreach($deviceId in $device.DevicePhysicalIds){
        if($deviceId.StartsWith("[HWID]")){
            $physId = $deviceId.Split(":")[-1]
        }
    }
    if($physId){
        if(!$hwIds.$physId){
            $hwIds.$physId = @{}
            $hwIds.$physId.Devices = @()
            $hwIds.$physId.DeviceCount = 0
        }
        $hwIds.$physId.DeviceCount++
        $hwIds.$physId.Devices += $device
    }
}

#select HW ID's that have multiple device entries
$hwIds.Keys | ForEach-Object {
    if($hwIds.$_.DeviceCount -gt 1){
        $duplicates.$_ = $hwIds.$_.Devices
    }
}

#loop over the duplicate HW Id's
$cleanedUp = 0
$totalDevices = 0
foreach($key in $duplicates.Keys){
    $mostRecent = (Get-Date).AddYears(-100)
    foreach($device in $duplicates.$key){
        $totalDevices++
        #detect which device is the most recently active device
        if([DateTime]$device.ApproximateLastLogonTimestamp -gt $mostRecent){
            $mostRecent = [DateTime]$device.ApproximateLastLogonTimestamp
        }
    }

    foreach($device in $duplicates.$key){
        if([DateTime]$device.ApproximateLastLogonTimestamp -lt $mostRecent){
            try{
                if($Force){
                    Remove-MsolDevice -DeviceId $device.DeviceId -Force -Confirm:$False -ErrorAction Stop
                    Write-Output "Removed Stale device $($device.DisplayName) with last active date: $($device.ApproximateLastLogonTimestamp)"
                }elseif($WhatIf){
                    Write-Output "Should disable Stale device $($device.DisplayName) with last active date: $($device.ApproximateLastLogonTimestamp)"               
                }else{
                    Disable-MsolDevice -DeviceId $device.DeviceId -Force -Confirm:$False -ErrorAction Stop
                    Write-Output "Disabled Stale device $($device.DisplayName) with last active date: $($device.ApproximateLastLogonTimestamp)"
                }
                $cleanedUp++
            }catch{
                Write-Output "Failed to disable Stale device $($device.DisplayName) with last active date: $($device.ApproximateLastLogonTimestamp)"
                Write-Output $_.Exception
            }
        }
    }
}

Write-Output "Total unique hardware ID's with >1 device registration: $($duplicates.Keys.Count)"

Write-Output "Total devices registered to these $($duplicates.Keys.Count) hardware ID's: $totalDevices" 

Write-Output "Devices cleaned up: $cleanedUp"