Comment puis-je modifier une tâche planifiée existante à l'aide de Powershell?

8

Je travaille sur certains scripts d'automatisation des versions qui utilisent Powershell pour mettre à jour les tâches planifiées existantes qui exécutent diverses applications. Dans mon script, je peux définir le chemin et le répertoire de travail de l'application, mais il ne semble pas enregistrer les modifications dans la tâche.

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

Jusqu'à présent, je n'ai pas pu trouver de fonction d'enregistrement évidente dans la documentation ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). Suis-je en train d'adopter la mauvaise approche, et dois-je jouer avec la tâche XML?

David Keaveny
la source
Avec quelle version de PowerShell travaillez-vous? Utilisez Get-Hostpour le découvrir.
Colyn1337
Version 2.0 (voir serverfault.com/questions/666671/… pour certains de mes malheurs liés à Verson!). Si votre solution fonctionne avec une version ultérieure de Powershell prise en charge par Server 2008 R2, cela me donnera un "coup de pouce" supplémentaire pour obtenir les serveurs mis à niveau :-)
David Keaveny
Le serveur 2008R2 prend actuellement en charge jusqu'à 4.0. Voir Configuration requise pour Windows PowerShell: technet.microsoft.com/en-us/library/hh847769.aspx
Davidw

Réponses:

2

La méthode RegisterTask a un indicateur de mise à jour que vous utiliseriez. Quelque chose comme ça:

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

Consultez l'article msdn pour plus de détails sur chaque paramètre.

James Santiago
la source
J'espère vraiment que ce n'est pas la seule solution, car je ne veux pas stocker les combinaisons nom d'utilisateur / mot de passe dans mes scripts de sortie si je peux l'aider ...
David Keaveny
Je pense que vous pouvez spécifier le compte système local et laisser le mot de passe nul.
James Santiago
Mes tâches planifiées s'exécutent sous des comptes de service créés spécifiquement, avec un accès à la base de données à l'aide de l'authentification Windows, il me faudrait donc conserver les informations d'identification existantes.
David Keaveny
Seuls les comptes système bien connus peuvent ignorer l'exigence de mot de passe comme si vous mettiez à jour ces tâches manuellement. Même les nouvelles applets de commande powershell nécessitent le nom d'utilisateur et le mot de passe lors de l'utilisation d'un compte inconnu. Je suppose que vous pouvez demander un mot de passe pendant l'exécution, le stocker sous forme de chaîne sécurisée dans une variable, puis y accéder en cas de besoin afin qu'il ne soit stocké en mémoire que lors de l'exécution du script.
James Santiago