Estou criando um script para instalar remotamente o módulo PSWindowsUpdate PowerShell, abrir as portas de firewall corretas e executar um comando para instalar as atualizações em espera. Para instalar o módulo PSWindowsUpdate, preciso instalar um MSI em algumas de minhas máquinas para habilitar o commandlet "Install-Module".
Se eu executar o seguinte código manualmente, em uma sessão de administrador do PowerShell em minha máquina local, ele 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 MESMA SESSÃO DO PowerShell JÁ ABERTA, o MSI não instala 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
}
Está me deixando louco. Executei o ProcessMonitor na máquina remota e posso ver o msiexec iniciar e parar sem acessar o MSI na raiz da unidade C: ou tentar abrir o arquivo de log para gravação.
Alguém já viu algo parecido? A máquina cliente é o Windows 7 pro, Powershell 4, e a máquina de destino é o Windows 2012 R2 e também o PowerShell 4.
Desde já, obrigado.
Esse problema pode ocorrer ao tentar executar blocos de script ou comandos que levam algum tempo 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. O uso de Start-Process com o parâmetro -wait faz com que o script aguarde até que o comando que está sendo executado seja concluído e retorne ao script. Eu notei isso antes ao instalar em máquinas remotas, enquanto a execução local sem Start-Process parecia funcionar bem.
A mudança de comando adequada, como você observou, é: