Invoke-Command не возвращается на локальную машину, но программное обеспечение установлено - PullRequest
0 голосов
/ 15 апреля 2020

Tl; dr: Я озадачен тем, почему мой сценарий не возвращается обратно на компьютер развертывания. У кого-нибудь есть идея, почему?

Мне предоставили EXE и несколько аргументов для установки какого-либо программного обеспечения. Я использую PowerShell Start-Process для его запуска. Развертывающий компьютер - контроллер домена Win Server 2012, вошел в систему и работает как администратор домена. Испытательные машины - две машины Windows 10 Pro. Все три имеют PS 5.1.

При установке без вывода сообщений взаимодействие с пользователем не требуется. Если я выполняю точную команду локально, через RDP или в pssession, просто набрав c:\Software.exe /silent /arg2removed, она устанавливается и возвращается, как и ожидалось.

Сценарий работает нормально до определенного момента. Ничего не происходит после Start-Process внутри Invoke-Command -ScriptBlock. В отдельном окне PowerShell я могу использовать Enter-PSSession для каждого из двух клиентских компьютеров, а Get-Service и Get-Process - оба, соответственно, отображают службу программного обеспечения и фоновые процессы. Я могу Ctrl + c на компьютере развертывания и вернуться к приглашению. Об ошибках в любое время не сообщается.

Вот фрагмент Start-Process. Я прочитал справку, и это не похоже на то, что мне не хватает ничего, что позволило бы ScriptBlock завершить sh. Если я добавлю Start-Process к Write-Host (как мы все делаем), он отобразит команду, которая будет выполняться, и я вернусь к командной строке на компьютере развертывания.

# Start the installer. 
Start-Process `
    -FilePath "C:\${using:SrcExe}" `
    -ArgumentList "/SILENT", "/arg2removed" `
    -WorkingDirectory C:\ `
    -Wait `
    -Verbose `
    -ErrorAction SilentlyContinue `
    -ErrorVariable InstallErrors

Вот большинство из скрипт. Единственные элементы перед Invoke-Command - это то, где я настраиваю $ComputersToInstallOn, введите учетные данные (да, я уверен, что они правильные) и укажите путь к EXE.

Invoke-Command `
    -ComputerName $ComputersToInstallOn `
    -Credential $Creds `
    -Verbose `
    -ErrorAction SilentlyContinue `
    -ErrorVariable InvokeCommErrors `
    -ScriptBlock {
        # Get and print the destination machine's hostname
        $ThisMachine = Get-Content Env:\COMPUTERNAME ; $ThisMachine

        # Print the current date and time
        Get-Date

        # Check if Sentinel processes are running. If not, assume it's not installed.
        $S1Procs = get-process sentinel*

        if([string]::IsNullOrEmpty($S1Procs)) {
            # Sentinel isn't installed. Continue.

            # Map a drive letter to $SrcFolder. Not theoretically necessary but Start-Process complains when copying with the UNC path directly.
            New-PSDrive `
                -Name S `
                -PSProvider FileSystem `
                -Credential ${using:Creds} `
                -Root ${using:SrcFolder} `
                -verbose

            # List remote folder
            Get-ChildItem S:\

            # Copy the $SrcExe to C:\
            Copy-Item `
                -Path "S:\${using:SrcExe}" `
                -Destination C:\ `
                -Verbose `
                -ErrorAction Stop `
                -ErrorVariable CopyErrors

            # Unmount drive
            Remove-PSDrive S -verbose

            # Verify EXE exists locally
            Get-ChildItem -Path C:\${using:SrcExe}

            # If there were copy errors, abort.
            if ($CopyErrors) {
                Write-Host "There was an error copying '${using:SrcExe}' to $ThisMachine. Aborting."
                exit 1 } else {
                # All good so far. Continue to install.

                Write-Host "$(Get-Date -UFormat '%Y%m%d %H:%M:%S') : Starting install on ${ThisMachine}. You may need to Ctrl+C to return to the local machine. Check processes on each machine though."

                # Start the installer. 
                Start-Process `
                    -FilePath "C:\${using:SrcExe}" `
                    -ArgumentList "/SILENT", "/arg2removed" `
                    -WorkingDirectory C:\ `
                    -Wait `
                    -Verbose `
                    -ErrorAction SilentlyContinue `
                    -ErrorVariable InstallErrors

                # ScriptBlock doesn't seem to make it to anything after Start-Process.

                # Remove the EXE.
                Remove-Item "C:\${using:SrcExe}" -Verbose -ErrorAction SilentlyContinue
                exit 0
                # Get-Process -Name Sentinel*
                # echo "Sleeping. Now would be the time to abort."
                # Start-Sleep 15
            }
        } else {
            Write-Host "Sentinel appears to be installed and running."
            $S1Procs
            Get-Service -Name Sentinel* | Where-Object { $_.Status -match "Running" }
            exit 0
        }
    }
if($InvokeCommErrors){
    Write-Host "There were some errors."
}

EDIT : добавлена ​​запрошенная информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...