If you manage a large number of AWS workspaces, chances are you will end up with orphaned computer AD objects cluttering up your domain.
This script pulls a list of workspaces, compares it to the list of machines in AWS managed AD and removes any AD computer object without a corresponding workspace.
This script requires you to have already set up AWS PowerShell and authentication. (See https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up-windows.html and https://docs.aws.amazon.com/powershell/latest/userguide/pstools-appendix-sign-up.html)
It will display a list of orphaned objects for you to review in a grid-view before proceeding with the delete.
##################################################### # V1.0 Jimmy White 01/12/2020 # # Check for and remove orphaned AD computers # # Gets list of AWS Workspaces and AD computers # # any ad computer without a workspace is removed # ##################################################### Clear-Host #change this line to the OU with all your workspace computer objects.. #there should be NO other types of computer objectsin this OU or they WILL be deleted.. $searchbase = "OU=Computers,OU=contoso,DC=com" #there may be some computers in this OU you wish to ignore, enter the prefix for them here.. $prefixToIgnore = "IP" $todelete = @() Write-host "`n`n`n`n`n`n`n`nGetting a list of AWS workspaces, this may take some time, please hold caller.." -ForegroundColor Green try{ $wks = Get-WKSWorkspace } catch { write-host "Trouble getting list of AWS workspaces, rate limit may have been exceeded, please try later" -ForegroundColor Red stop } $AWSComputernames = $wks.ComputerName $adcomputernames = (get-adcomputer -SearchBase $searchbase -filter *).name $progress=1 Write-host "Hold to your hats, about to do some sums.." -ForegroundColor Cyan foreach($adcomputer in $adcomputernames) { $perc = [math]::Round((100/$adcomputernames.count) * $progress,2) Write-Progress -Id 1 -activity "Working on $adcomputer" -status "$perc% Complete:" -PercentComplete $perc if($AWSComputernames.Contains($adcomputer) -eq $false) { #computer says no! if($adcomputer.startswith($prefixToIgnore) -eq $false){ $todelete += $adcomputer } } $progress ++ } write-host "About to delete " $todelete.count " AD computer objects..." -ForegroundColor yellow $todelete | out-gridview if($todelete.count -le 100){ write-host "Its a slow day, only " $todelete.count " objects to delete" -ForegroundColor Cyan }else { write-host "Wow! its messy in here, we have " $todelete.count " objects to delete!!!" -ForegroundColor DarkYellow } $confirmation = Read-Host "Are you Sure You Want To Proceed:" if ($confirmation -eq 'y') { # proceed $progress=1 foreach($computer in $todelete) { $perc = [math]::Round((100/$todelete.count) * $progress,2) Write-Progress -Id 1 -activity "Deleting $computer" -status "$perc% Complete:" -PercentComplete $perc get-adcomputer $computer | Remove-ADComputer -Confirm:$false $progress ++ } write-host "Finished! $todelete.count objects were removed" -ForegroundColor Cyan } else { write-host "Aborted" -foregroundcolor red }