Come posso modificare un'attività pianificata esistente usando Powershell?


8

Sto lavorando ad alcuni script di automazione delle versioni che utilizzano Powershell per aggiornare attività pianificate esistenti che eseguono varie applicazioni. Nel mio script, posso impostare il percorso e la directory di lavoro dell'applicazione, ma non sembra salvare le modifiche all'attività.

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

Finora non sono stato in grado di trovare un'ovvia funzione di salvataggio nella documentazione ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). Sto adottando un approccio sbagliato qui, e ho bisogno di pasticciare con l'attività XML?


Con quale versione di PowerShell stai lavorando? Utilizzare Get-Hostper scoprirlo.
Colyn1337,

Versione 2.0 (vedi serverfault.com/questions/666671/… per alcuni dei miei problemi legati al verson!). Se la tua soluzione funziona con una versione successiva di Powershell che è supportata da Server 2008 R2, questo mi darà "ulteriore spinta" per aggiornare i server :-)
David Keaveny,

Server 2008R2 attualmente supporta fino a 4.0. Vedi i requisiti di Windows PowerShell: technet.microsoft.com/en-us/library/hh847769.aspx
Davidw,

Risposte:


2

Il metodo RegisterTask ha un flag di aggiornamento che useresti. Qualcosa come questo:

# 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)

Vedi l'articolo msdn per i dettagli su ciascun parametro.


Spero davvero che questa non sia l'unica soluzione, in quanto non voglio archiviare combinazioni nome utente / password nei miei script di rilascio se posso aiutarlo ...
David Keaveny,

Credo che tu possa specificare l'account di sistema locale e lasciare la password nulla.
James Santiago,

Le mie attività pianificate vengono eseguite con account di servizio appositamente creati, con accesso al database tramite l'autenticazione di Windows, quindi dovrei comunque conservare le credenziali esistenti.
David Keaveny,

Solo gli account di sistema noti possono saltare lo stesso requisito della password come se si aggiornassero queste attività manualmente. Anche i nuovi cmdlet di PowerShell richiedono nome utente e password quando si utilizza un account non noto. Suppongo che potresti richiedere una password durante il runtime, archiviarla come stringa protetta in una variabile, quindi accedervi quando necessario in modo che sia memorizzata solo quando si esegue lo script.
James Santiago,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.