Wie kann ich eine vorhandene geplante Aufgabe mit Powershell ändern?

8

Ich arbeite an einigen Release-Automatisierungsskripten, die Powershell verwenden, um vorhandene geplante Aufgaben zu aktualisieren, mit denen verschiedene Anwendungen ausgeführt werden. In meinem Skript kann ich den Pfad und das Arbeitsverzeichnis der Anwendung festlegen, aber es scheint nicht, dass die Änderungen wieder in der Aufgabe gespeichert werden.

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

Ich konnte bisher keine offensichtliche Speicherfunktion in der Dokumentation finden ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). Verfolge ich hier den falschen Ansatz und muss mit der XML-Aufgabe herumspielen?

David Keaveny
quelle
Mit welcher Version von Powershell arbeiten Sie? Verwenden Sie Get-Host, um herauszufinden.
Colyn1337
Version 2.0 (siehe serverfault.com/questions/666671/… für einige meiner versonbezogenen Probleme!). Wenn Ihre Lösung mit einer späteren Version von Powershell funktioniert, die von Server 2008 R2 unterstützt wird, gibt mir dies einen zusätzlichen "Push", um die Server zu aktualisieren :-)
David Keaveny
Server 2008R2 unterstützt derzeit bis zu 4.0. Siehe Windows PowerShell-Anforderungen: technet.microsoft.com/en-us/library/hh847769.aspx
Davidw

Antworten:

2

Die RegisterTask- Methode verfügt über ein Aktualisierungsflag, das Sie verwenden würden. Etwas wie das:

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

Weitere Informationen zu den einzelnen Parametern finden Sie im msdn-Artikel.

James Santiago
quelle
Ich hoffe wirklich, dass dies nicht die einzige Lösung ist, da ich keine Kombinationen aus Benutzername und Passwort in meinen Release-Skripten speichern möchte, wenn ich helfen kann ...
David Keaveny
Ich glaube, Sie können das lokale Systemkonto angeben und das Kennwort null lassen.
James Santiago
Meine geplanten Aufgaben werden unter speziell erstellten Dienstkonten mit Datenbankzugriff über die Windows-Authentifizierung ausgeführt, sodass ich die vorhandenen Anmeldeinformationen weiterhin beibehalten muss.
David Keaveny
Nur bekannte Systemkonten können die Kennwortanforderung so überspringen, als würden Sie diese Aufgaben manuell aktualisieren. Sogar die neuen Powershell-Cmdlets benötigen den Benutzernamen und das Passwort, wenn Sie ein nicht bekanntes Konto verwenden. Ich nehme an, Sie könnten zur Laufzeit nach einem Kennwort fragen, es als sichere Zeichenfolge in einer Variablen speichern und dann bei Bedarf darauf zugreifen, damit es nur beim Ausführen des Skripts im Speicher gespeichert wird.
James Santiago