8 votos

¿Cómo imprimir información sobre el Programador de tareas en un script de PowerShell?

Estoy tratando de imprimir información del Programador de tareas del ordenador local en un script de PowerShell para que otros usuarios también puedan imprimir esta información sin necesidad de acceder al Programador de tareas. Necesito que el script imprima

  • nombre,
  • estado,
  • desencadenantes,
  • próxima ejecución,
  • última ejecución,
  • resultado de la última ejecución,
  • autor,
  • creado.

Puedo imprimir la información sobre el nombre, la próxima ejecución y la última ejecución, pero el resto no se imprime cuando ejecuto el script.

Ya he empezado un poco con mi script y he establecido los campos.

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0)

$tasks | select Name,Status,Triggers,NextRunTime,LastRunTime,LastRunResult,Author,Created | ft

foreach ($t in $tasks)
{
foreach ($a in $t.Actions)
{
$a.Path
}
}

Cualquier ayuda o sugerencia sería apreciada.

A continuación se muestra una captura de pantalla con lo que estoy buscando y qué campos no están imprimiendo datos:

A continuación se muestra una captura de pantalla con lo que estoy buscando y qué campos no están imprimiendo datos:

1 votos

Está en blanco porque no está disponible en el objeto. Si ejecutas $Tareas | Obtener-Miembro ¿Qué obtienes?

1 votos

Mira lo que contiene $tareas. No tiene todo lo que quieres mostrar: Nombre, Ruta, Estado, Habilitado, HoraUltimaEjecución, UltimoResultadoTarea, NúmeroEjecucionesPerdidas, PróximaEjecución, Definición, Xml.

0 votos

He actualizado mi respuesta ¿Todavía no tiene lo que necesita?

5voto

BigHomie Puntos 3983

Server 2012 R2 y Windows 8.1 tienen cmdlets del Programador de tareas, y este módulo se puede copiar y utilizar en una máquina con Windows 7, probablemente también necesita la última versión de .NET y el Marco de administración de Windows. Puedo desactivar y volver a habilitar tareas programadas, así como mostrar información sobre las tareas. Actualmente no conozco cmdlets integrados que me den esta información o permitan este control.

Para listar todas las tareas programadas en la máquina:

Get-ScheduledTask

Puedes obtener los siguientes miembros del objeto de secuencia de tareas:

PS C:\BigHomie> $A = Get-ScheduledTask | select -First 1

PS C:\BigHomie> $A

       TypeName: Microsoft.Management.Infrastructure.CimInstance#Root/Microsoft/Windows/TaskScheduler/MSFT_ScheduledTask

Name                      MemberType     Definition
----                      ----------     ----------
Clone                     Method         System.Object ICloneable.Clone()
Dispose                   Method         void Dispose(), void IDisposable.Dispose()
Equals                    Method         bool Equals(System.Object obj)
GetCimSessionComputerName Method         string GetCimSessionComputerName()
GetCimSessionInstanceId   Method         guid GetCimSessionInstanceId()
GetHashCode               Method         int GetHashCode()
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, Sys...
GetType                   Method         type GetType()
ToString                  Method         string ToString()
Actions                   Property       CimInstance#InstanceArray Actions {get;set;}
Author                    Property       string Author {get;set;}
Date                      Property       string Date {get;set;}
Description               Property       string Description {get;set;}
Documentation             Property       string Documentation {get;set;}
Principal                 Property       CimInstance#Instance Principal {get;set;}
PSComputerName            Property       string PSComputerName {get;}
SecurityDescriptor        Property       string SecurityDescriptor {get;set;}
Settings                  Property       CimInstance#Instance Settings {get;set;}
Source                    Property       string Source {get;set;}
TaskName                  Property       string TaskName {get;}
TaskPath                  Property       string TaskPath {get;}
Triggers                  Property       CimInstance#InstanceArray Triggers {get;set;}
URI                       Property       string URI {get;}
Version                   Property       string Version {get;set;}
State                     ScriptProperty System.Object State {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes...

PS C:\BigHomie> $A.Triggers

Enabled            : True
EndBoundary        :
ExecutionTimeLimit :
Id                 :
Repetition         : MSFT_TaskRepetitionPattern
StartBoundary      :
PSComputerName     :

0 votos

Gracias por tu respuesta, pero estoy buscando más información sobre el servicio "Programador de tareas" y las tareas actuales que están en el servicio "Programador de tareas". ¡Agregaré pronto una captura de pantalla para mostrar en qué necesito ayuda!

0 votos

Jimmyboy, ¿cómo es eso diferente a lo que te he dado?

0 votos

¿Estás utilizando ciertos módulos que no se ejecutan de forma predeterminada?

5voto

ChuckB Puntos 688

Esto se podría limpiar un poco (es decir, mapeando los códigos de LastRunResult). Déjame saber si necesitas ayuda. Los desencadenadores son un poco más difíciles ya que no creo que la representación en inglés simple que ves al ver una tarea en la GUI exista en el objeto COM. Creo que tendría que ser construido a partir de la TriggerCollection almacenada en RegisteredTask.Definition.Triggers

$sched = New-Object -Com "Schedule.Service"
$sched.Connect()
$out = @()
$sched.GetFolder("\").GetTasks(0) | % {
    $xml = [xml]$_.xml
    $out += New-Object psobject -Property @{
        "Name" = $_.Name
        "Status" = switch($_.State) {0 {"Desconocido"} 1 {"Deshabilitado"} 2 {"En cola"} 3 {"Listo"} 4 {"Ejecutando"}}
        "NextRunTime" = $_.NextRunTime
        "LastRunTime" = $_.LastRunTime
        "LastRunResult" = $_.LastTaskResult
        "Author" = $xml.Task.Principals.Principal.UserId
        "Created" = $xml.Task.RegistrationInfo.Date
    }
}

$out | fl Name,Status,NextRunTime,LastRunTime,LastRunResult,Author,Created

0 votos

Esto hizo exactamente lo que necesitaba, solo con la excepción de que los disparadores no se llaman, pero puedo investigar más y encontrar algo al respecto. ¡Muchas gracias!

1 votos

¿Cómo uso esto para conectarme de forma remota a otro servidor? (aún estoy en el mismo dominio) ¿uso el invoke-command?

3 votos

Claro, invoke-command -ComputerName REMOTEPC -ScriptBlock { --Pegar bloque de script completo aquí-- }

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X