Lendo o Windows Tasks de um servidor remoto

Nesta semana surgiu a necessedidade de conseguir uma lista das tarefas agendadas em um servidor remoto. Tentei usando a classe WMI disponivel para isso, mas como o filosofo Jagger disse uma vez: 'You can't always get what you want.'

Depois de uma pequena pesquisa encontrei um artigo sobre o uso da API SCHTASK. A referência completa pode ser encontrada no MSDN em http://msdn.microsoft.com/en-us/library/aa383608(VS.85).aspx.

Você se perguntaria: Então porque não posso usar a classe WMI pra fazer isso? Bem, acontece que o Windows tem duas APIs diferentes para gerenciar as tarefas agendadas. A primeira é a Task Scheduler API usada pelo Task Scheduler e pelo utilitário Schtasks, a segunda é a conhecida AT API usada pelo comando AT.exe e pela classe WMI Win32_Schedule.

A maior parte das minhas tarefas agendadas foi criada usando a interface do Task Scheduler, então quando consulto a classe WMI não recebo resultado nenhum. O script abaixo contorna este problema. Ele irá funcionar somente com Windows Vista ou superior.

param
(
[string] $server = $(throw "Server name required.")
)
## Format table
$tmName = @{ l = "Name"; e = {$_.Name}; f = "{}"}
$tmPath = @{ l = "Path"; e = {$_.path}; f = "{}"}
$tmEnabled = @{ l = "Enabled"; e = {$_.enabled}; f = "{}"}
$tmLRunTime = @{ l = "LastRunTime"; e = {$_.lastruntime}; f = "{}"}
$tmNRunTime = @{ l = "NextRunTime"; e = {$_.nextruntime}; f = "{}"}
$tmState = @{ l = "state"; e = {
switch($_.state)
{
0 {"UNKNOWN"}
1 {"DISABLED"}
2 {"QUEUED"}
3 {"READY"}
4 {"RUNNING"}
}       
}; f="{}" }
$tableMask = $tmName, $tmPath, $tmEnabled, $tmLRunTime, $tmNRunTime, $tmState

## Create object and get the tasks
$schtObj = new-object -com("Schedule.Service")
$schtObj.connect("$server")
#Get to root folder (\) to create the task definition
$RootFolder = $schtObj.getfolder("\")
$ScheduledTasks = $RootFolder.GetTasks(0)
## Show results in a format table
$ScheduledTasks | select name, path, enabled, lastruntime, nextruntime, state |ft $tableMask -auto

Puristas diriam: "Você não esta retornando objetos. Que horrivel!!". Como voces devem saber, puristas são pessoas chatas, mas neste caso eles estão certos. Em minha defesa tenho duas razões para não retornar objetos neste script. Primeiro: Preguiça; daquelas que todo ser humano tem direito as vezes. Segundo: Do modo como esta, o script satisfaz as minhas necessidades e é pra isso que um bom script deve servir, no futuro se houver necessidade não deve ser dificil adapta-lo para retornar objetos.

Finalmente, você pode obter resultados similares utilizando o Schtasks.exe, neste caso, sem toda a diversão que o Powershell oferece. ;)

Comentários

Postagens mais visitadas deste blog

Consultando usuario atualmente logado

Resolvendo a Provinha do Google Developer Day Brasil 2011 com Powershell

BIG-IP Cookie decode