¿Cómo puedo modificar una tarea programada existente usando Powershell?

8

Estoy trabajando en algunos scripts de automatización de versiones que usan Powershell para actualizar las tareas programadas existentes que ejecutan varias aplicaciones. En mi script, puedo configurar la ruta y el directorio de trabajo de la aplicación, pero no parece guardar los cambios en la tarea.

function CreateOrUpdateTaskRunner {
    param (
        [Parameter(Mandatory = $TRUE, Position = 1)][string]$PackageName,
        [Parameter(Mandatory = $TRUE, Position = 2)][Version]$Version,
        [Parameter(Mandatory = $TRUE, Position = 3)][string]$ReleaseDirectory
    )

    $taskScheduler = New-Object -ComObject Schedule.Service
    $taskScheduler.Connect("localhost")
    $taskFolder = $taskScheduler.GetFolder('\')

    foreach ($task in $taskFolder.GetTasks(0)) {

        # Check each action to see if it references the current package
        foreach ($action in $task.Definition.Actions) {

            # Ignore actions that do not execute code (e.g. send email, show message)
            if ($action.Type -ne 0) {
                continue
            }

            # Ignore actions that do not execute the specified task runner
            if ($action.WorkingDirectory -NotMatch $application) {
                continue
            }

            # Find the executable
            $path = Join-Path $ReleaseDirectory -ChildPath $application | Join-Path -ChildPath $Version
            $exe = Get-ChildItem $path -Filter "*.exe" | Select -First 1

            # Update the action with the new working directory and executable
            $action.WorkingDirectory = $exe.DirectoryName
            $action.Path = $exe.FullName
        }
    }
}

Hasta ahora no he podido encontrar una función Guardar obvia en la documentación ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). ¿Estoy tomando el enfoque equivocado aquí y necesito perder el tiempo con la tarea XML?

David Keaveny
fuente
¿Con qué versión de powershell estás trabajando? Use Get-Hostpara averiguarlo.
Colyn1337
Versión 2.0 (vea serverfault.com/questions/666671/… para algunos de mis problemas relacionados con verson!). Si su solución funciona con una versión posterior de Powershell que es compatible con Server 2008 R2, eso me dará un "empuje" adicional para actualizar los servidores :-)
David Keaveny
Server 2008R2 admite hasta 4.0 actualmente. Consulte los requisitos de Windows PowerShell: technet.microsoft.com/en-us/library/hh847769.aspx
Davidw

Respuestas:

2

El método RegisterTask tiene un indicador de actualización que usaría. Algo como esto:

# Update the action with the new working directory and executable
$action.WorkingDirectory = $exe.DirectoryName
$action.Path = $exe.FullName

#Update Task
$taskFolder.RegisterTask($task.Name, $task.Definition, 4, "<username>", "<password>", 1, $null)

Consulte el artículo de msdn para obtener detalles sobre cada parámetro.

James Santiago
fuente
Realmente espero que esta no sea la única solución, ya que no quiero almacenar combinaciones de nombre de usuario / contraseña en mis scripts de lanzamiento si puedo evitarlo ...
David Keaveny
Creo que puede especificar la cuenta del sistema local y dejar la contraseña nula.
James Santiago
Mis tareas programadas se ejecutan en cuentas de servicio creadas específicamente, con acceso a la base de datos utilizando la autenticación de Windows, por lo que aún necesitaría mantener las credenciales existentes.
David Keaveny
Solo las cuentas conocidas del sistema pueden saltarse el requisito de contraseña igual que si actualizara estas tareas manualmente. Incluso los nuevos cmdlets de PowerShell requieren el nombre de usuario y la contraseña cuando se utiliza una cuenta desconocida. Supongo que puede solicitar una contraseña durante el tiempo de ejecución, almacenarla como una cadena segura en una variable y luego acceder a ella cuando sea necesario para que solo se almacene en la memoria cuando se ejecuta el script.
James Santiago