Как я могу изменить существующее запланированное задание, используя Powershell?

8

Я работаю над некоторыми сценариями автоматизации выпуска, которые используют Powershell для обновления существующих запланированных задач, которые выполняют различные приложения. В моем сценарии я могу установить путь и рабочий каталог приложения, но, похоже, он не сохраняет изменения обратно в задачу.

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

До сих пор я не смог найти очевидную функцию сохранения в документации ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). Я использую неправильный подход, и мне нужно возиться с задачей XML?

Дэвид Кивини
источник
С какой версией powershell вы работаете? Используйте, Get-Hostчтобы узнать.
Colyn1337,
Версия 2.0 (см. Serverfault.com/questions/666671/… для некоторых моих проблем, связанных с версоном!). Если ваше решение работает с более поздней версией Powershell, которая поддерживается Server 2008 R2, тогда это даст мне дополнительный «толчок» для обновления серверов :-)
David Keaveny
Сервер 2008R2 поддерживает до 4.0 в настоящее время. См. Требования Windows PowerShell: technet.microsoft.com/en-us/library/hh847769.aspx
Davidw

Ответы:

2

Метод RegisterTask имеет флаг обновления, который вы бы использовали. Что-то вроде этого:

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

См. Статью msdn для деталей о каждом параметре.

Джеймс Сантьяго
источник
Я действительно надеюсь, что это не единственное решение, так как я не хочу хранить комбинации имени пользователя и пароля в моих сценариях выпуска, если смогу помочь ...
Дэвид Кивини
Я считаю, что вы можете указать локальную системную учетную запись и оставить пароль пустым.
Джеймс Сантьяго
Мои запланированные задания выполняются под специально созданными учетными записями служб с доступом к базе данных с использованием проверки подлинности Windows, поэтому мне все равно необходимо сохранить существующие учетные данные.
Дэвид Кивини
Только общеизвестные системные учетные записи могут пропустить требование пароля так же, как если бы вы обновляли эти задачи вручную. Даже новые командлеты powershell требуют использования имени пользователя и пароля при использовании малоизвестной учетной записи. Я полагаю, вы могли бы запросить пароль во время выполнения, сохранить его в виде безопасной строки в переменной, а затем получить к нему доступ при необходимости, чтобы он сохранялся в памяти только при запуске сценария.
Джеймс Сантьяго