Powershell Invoke-Command funciona quando executado manualmente, mas não quando em um script

1

Estou construindo um script para instalar remotamente o módulo PowerShell do PSWindowsUpdate, abrir as portas corretas do firewall e, em seguida, executar um comando para instalar as atualizações em espera. Para instalar o módulo PSWindowsUpdate, eu preciso instalar um MSI em algumas de minhas máquinas para ativar o commandlet "Install-Module".

Se eu executar o código a seguir manualmente, em uma sessão admin do PowerShell em minha máquina local, tudo funcionará bem:

$RemoteMachine = "DCSvrRDS16"
write-host "Server Name is: $RemoteMachine"

#Copy the MSI Local to the computer
Write-Host "Copying MSI locally"
Copy "\dcsvrstorage2\software\microsoft\powershell\PackageManagement_x64.msi" \$RemoteMachine\c$\

#Run the MSI remotely
Write-Host "Running MSI"
Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { c:\windows\system32\msiexec /i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log } 4>&1

Mas se eu executar este script completo NA SESSÃO DO EXECT MAME JÁ ABERTA DO PowerShell, o MSI não é instalado e o arquivo de log não é criado:

Import-Module PSWindowsUpdate
$domaincredentials = Get-Credential


Function ProcessMachine($RemoteMachine) {

    write-host "Server Name is: $RemoteMachine"

    #Copy the MSI Local to the computer
    Write-Host "Copying MSI locally"
    Copy "\dcsvrstorage2\software\microsoft\powershell\PackageManagement_x64.msi" \$RemoteMachine\c$\

    #Run the MSI remotely
    Write-Host "Running MSI"
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { c:\windows\system32\msiexec /i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log } 4>&1

    #Install the module
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Install-Module PSWindowsUpdate -Force }

    #Turn on the firewall rules
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Set-NetFirewallRule -DisplayName "COM+ Network Access (DCOM-In)" -Enabled True }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Set-NetFirewallRule -DisplayName "COM+ Remote Administration (DCOM-In)" -Enabled True }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Remove-NetFirewallRule -DisplayName "Remote WSUS Install" }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { New-NetFirewallRule -DisplayName "Remote WSUS Install" -Profile Domain -Enabled True -Direction Inbound -Action Allow -Protocol TCP -LocalPort RPC }

    #Try the update
    Install-WindowsUpdate -ComputerName $RemoteMachine -AcceptAll
}

foreach ($machine in (Get-Content NeedsWSUS.txt)) {

    ProcessMachine $machine

}

Isso está me deixando louco. Eu executei o ProcessMonitor na máquina remota e consigo ver o msiexec iniciar e depois parar sem acessar o MSI na raiz da unidade C: ou tentar abrir o arquivo de log para gravação.

Alguém viu algo parecido? A máquina cliente é o Windows 7 pro, o Powershell 4, e a máquina de destino é o Windows 2012 R2 e também o PowerShell 4.

Obrigado antecipadamente.

    
por Glenn Sullivan 21.10.2018 / 04:13

1 resposta

2

Esse problema pode ocorrer ao tentar executar blocos de script ou comandos que demoram um pouco para serem executados (especialmente com atividades de instalação). O script está retornando antes que o comando no bloco de script tenha concluído sua atividade. Usando Start-Process com o parâmetro -wait, o script aguarda até que o comando que está sendo executado seja concluído e retornado ao script. Eu notei isso antes quando instalando em máquinas remotas, enquanto a execução localmente sem o Start-Process parecia funcionar bem.

A alteração apropriada do comando, como você observou, é:

Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Start-Process msiexec "/i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log" -wait }

    
por 21.10.2018 / 08:05

Tags