A few of you sent mail asking how to delete an agent using the Command Shell. There is a Cmdlet for uninstalling an agent called Uninstall-Agent. However, uninstalling an agent will not work if the computer the agent is hosted by is not available. To help address the issue I created a function to automate the process. Keep in mind this function should only be used to delete an agent hosted by a computer that no longer exists otherwise you should use Uninstall-Agent.
# Summary# Delete an agent hosted by a non-existent computer.# Params# AgentNames - An array of strings that contain the FQDN of agents to delete.# Returns# Nonefunction global:Delete-Agent([System.String[]] $agentNames){ $NoAgentsErrorMsg = "`nNo agent names specified. Please specify the FQDN for each agent you want to delete.`n"; if ($agentNames -eq $null) { Write-Host $NoAgentsErrorMsg; return; } $administration = (get-item .).ManagementGroup.GetAdministration(); $agentManagedComputerType = [Microsoft.EnterpriseManagement.Administration.AgentManagedComputer]; $genericListType = [System.Collections.Generic.List``1] $genericList = $genericListType.MakeGenericType($agentManagedComputerType) $agentList = new-object $genericList.FullName foreach ($agentName in $agentNames) { $agent = Get-Agent | where {$_.PrincipalName -eq $agentName} if ($agent -eq $null) { $msg = "Agent '{0}' not found." -f $agentName; Write-Host $msg; } else { $agentList.Add($agent); } } if ($agentList.Count -eq 0) { Write-Host $NoAgentsErrorMsg; return; } $genericReadOnlyCollectionType = [System.Collections.ObjectModel.ReadOnlyCollection``1] $genericReadOnlyCollection = $genericReadOnlyCollectionType.MakeGenericType($agentManagedComputerType) $agentReadOnlyCollection = new-object $genericReadOnlyCollection.FullName @(,$agentList); $msg = "`nDeleting {0} agents:`n" -f $agentReadOnlyCollection.Count; Write-Host $msg; foreach ($agent in $agentReadOnlyCollection) { Write-Host $agent.PrincipalName; } $administration.DeleteAgentManagedComputers($agentReadOnlyCollection);}
# Summary# Delete an agent hosted by a non-existent computer.# Params# AgentNames - An array of strings that contain the FQDN of agents to delete.# Returns# Nonefunction global:Delete-Agent([System.String[]] $agentNames){ $NoAgentsErrorMsg = "`nNo agent names specified. Please specify the FQDN for each agent you want to delete.`n";
if ($agentNames -eq $null) { Write-Host $NoAgentsErrorMsg; return; }
$administration = (get-item .).ManagementGroup.GetAdministration();
$agentManagedComputerType = [Microsoft.EnterpriseManagement.Administration.AgentManagedComputer];
$genericListType = [System.Collections.Generic.List``1] $genericList = $genericListType.MakeGenericType($agentManagedComputerType)
$agentList = new-object $genericList.FullName
foreach ($agentName in $agentNames) { $agent = Get-Agent | where {$_.PrincipalName -eq $agentName} if ($agent -eq $null) { $msg = "Agent '{0}' not found." -f $agentName; Write-Host $msg;
} else { $agentList.Add($agent); } }
if ($agentList.Count -eq 0) { Write-Host $NoAgentsErrorMsg; return; }
$genericReadOnlyCollectionType = [System.Collections.ObjectModel.ReadOnlyCollection``1] $genericReadOnlyCollection = $genericReadOnlyCollectionType.MakeGenericType($agentManagedComputerType)
$agentReadOnlyCollection = new-object $genericReadOnlyCollection.FullName @(,$agentList);
$msg = "`nDeleting {0} agents:`n" -f $agentReadOnlyCollection.Count; Write-Host $msg; foreach ($agent in $agentReadOnlyCollection) { Write-Host $agent.PrincipalName; } $administration.DeleteAgentManagedComputers($agentReadOnlyCollection);}
Hope that helps and as always please post your questions and comments and I will make sure they are addressed in future posts.
Roger Sprague