Как я могу изменить существующее запланированное задание, используя 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 требуют использования имени пользователя и пароля при использовании малоизвестной учетной записи. Я полагаю, вы могли бы запросить пароль во время выполнения, сохранить его в виде безопасной строки в переменной, а затем получить к нему доступ при необходимости, чтобы он сохранялся в памяти только при запуске сценария.
— Джеймс Сантьяго
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.