Como posso modificar uma tarefa agendada existente usando o Powershell?

8

Estou trabalhando em alguns scripts de automação de versão que usam o Powershell para atualizar tarefas agendadas existentes que executam vários aplicativos. No meu script, posso definir o caminho e o diretório de trabalho do aplicativo, mas ele não parece salvar as alterações na tarefa.

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
        }
    }
}

Até agora, não consegui encontrar uma função Salvar óbvia na documentação ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). Estou adotando a abordagem errada aqui e preciso mexer com o XML da tarefa?

David Keaveny
fonte
Com qual versão do PowerShell você está trabalhando? Use Get-Hostpara descobrir.
Colyn1337
Versão 2.0 (consulte serverfault.com/questions/666671/… para alguns dos meus problemas relacionados à verson!). Se a sua solução funciona com uma versão posterior do PowerShell que é suportado pelo Server 2008 R2, em seguida, que vai me dar extra "push" para obter os servidores atualizado :-)
David Keaveny
O Server 2008R2 suporta até 4.0 atualmente. Consulte Requisitos do Windows PowerShell: technet.microsoft.com/en-us/library/hh847769.aspx
Davidw

Respostas:

2

O método RegisterTask possui um sinalizador de atualização que você usaria. Algo assim:

# 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 o artigo msdn para obter detalhes sobre cada parâmetro.

James Santiago
fonte
Eu realmente espero que isso não é a única solução, como eu não quero estar armazenando combinações de usuário / senha em meus scripts libertação se eu posso ajudá-lo ...
David Keaveny
Eu acredito que você pode especificar a conta do sistema local e deixar a senha nula.
James Santiago
Minhas tarefas agendadas são executadas em contas de serviço criadas especificamente, com acesso ao banco de dados usando autenticação do Windows, portanto, eu ainda precisaria manter as credenciais existentes.
David Keaveny
Somente contas de sistema conhecidas ignoram o requisito de senha, como se você atualizasse essas tarefas manualmente. Até os novos cmdlets do PowerShell exigem o nome de usuário e a senha ao usar uma conta não conhecida. Suponho que você possa solicitar uma senha durante o tempo de execução, armazená-la como uma sequência segura em uma variável e acessá-la quando necessário, para que seja armazenada apenas na memória ao executar o script.
James Santiago