OpsMgr 2007: Como fazer reset à cache de todos os agentes

Estive a trabalhar num problema onde, como solução alternativa tínhamos de fazer um reset à cache de todos os agentes activos e a funcionar bem. Geralmente, podemos fazer isso de forma manual (parar o serviço, apagar a pasta "C:\Program Files\System Center Operations Manager 2007\Health Service State\Health Service State" e arrancar novamente o serviço) ou então executando a seguinte tarefa na consola:

Podemos usar estes procedimentos (o primeiro pode ser automatizado), mas encontrei uma forma mais simples de o fazer, usando o PowerShell do OpsMgr. As linhas a executar são as seguintes: 

# Fazer o reset à cache de todos os agentes activos
# Reset or clear the cache of all active agents
$task = Get-Task | Where-Object {$_.Name -eq "Microsoft.SystemCenter.ResetHealthServiceStore"}
$agentclass = get-monitoringclass -name "Microsoft.SystemCenter.Agent"
$agents = Get-MonitoringObject -monitoringclass:$agentclass | where { $_.IsAvailable -eq $true}
$agents | foreach {start-task -task $task -targetMonitoringObject $_ -Asynchronous}

Com estas 4 linhas conseguimos executar de forma rápida e automatica, a tarefa de limpar a cache em todos os agentes. Nota para a última linha, onde definimos a execução assíncrona da tarefa em cada agente, visto que como é uma tarefa que vai limpar a cache do agente, o mesmo nunca vai reportar a execução da tarefa.

Este código de PowerShell também pode ser útil depois da instalação da seguinte correção, já que a mesma requere que seja limpa a cache pois a cache já poderá estar corrompida (secção 'Workaround'):

Management servers or assigned agents unexpectedly appear as unavailable in the Operations Manager console in Windows Server 2003 or Windows Server 2008 - https://support.microsoft.com/kb/981263

Esta solução pode servir ainda de base para outras, já que usando o mesmo modelo, poderemos executar outras tarefas em qualquer classe do Operations Manager. Alguns exemplos:

# Obter a lista de processos em execução em todas as máquinas Windows 2008 que tenham o agente activo
# Get the process list of all active Windows 2008 computers with an active agent
$task = Get-Task | Where-Object {$_.Name -eq "Microsoft.Windows.Server.2008.Computer.ProcessList.Task"}
$w2008class = get-monitoringclass -name "Microsoft.Windows.Server.2008.Computer"
$w2008computers = Get-MonitoringObject -monitoringclass:$w2008class | where { $_.IsAvailable -eq $true}
$w2008computers | foreach {start-task -task $task -targetMonitoringObject $_ -Asynchronous}

 

# Executar o checkdisk em todos os discos logicos Windows 2008 activos
# Execute checkdisk on all active Windows 2008 logical disks
$task = Get-Task | Where-Object {$_.Name -eq "Microsoft.Windows.Server.2008.LogicalDisk.Chkdsk.Task"}
$w2008diskclass = get-monitoringclass -name "Microsoft.Windows.Server.2008.LogicalDisk"
$w2008logicaldisks = Get-MonitoringObject -monitoringclass:$w2008diskclass | where { $_.IsAvailable -eq $true and $_.DisplayName -eq "true"}
$w2008logicaldisks | foreach {start-task -task $task -targetMonitoringObject $_ -Asynchronous}

 

# Executar o checkdisk em todos os discos logicos Windows 2008 activos, com a letra "C:"
# Execute checkdisk on all active Windows 2008 logical disks with the "C:" drive letter
$task = Get-Task | Where-Object {$_.Name -eq "Microsoft.Windows.Server.2008.LogicalDisk.Chkdsk.Task"}
$w2008diskclass = get-monitoringclass -name "Microsoft.Windows.Server.2008.LogicalDisk"
$w2008logicaldisks = Get-MonitoringObject -monitoringclass:$w2008diskclass | where { $_.IsAvailable -eq $true -and $_.DisplayName -eq "C:"}
$w2008logicaldisks | foreach {start-task -task $task -targetMonitoringObject $_ -Asynchronous}

Depois de submeter as tarefas, podemos verificar a sua execução resultado na vista 'Task Status' da consola de administração:

Espero que esta entrada vos ajude!

José Miguel Constantino

Support Escalation Engineer