我正在构建一个脚本来远程安装 PSWindowsUpdate PowerShell 模块,打开正确的防火墙端口,然后运行命令来安装等待更新。为了安装 PSWindowsUpdate 模块,我需要在我的一些机器上安装 MSI 以启用“Install-Module”命令行开关。
如果我在本地计算机上的管理员 PowerShell 会话中手动运行以下代码,它可以正常工作:
$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
但是,如果我在完全相同的已打开 PowerShell 会话中运行此完整脚本,则不会安装 MSI 并且不会创建日志文件:
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
}
这让我快疯了。我已经在远程机器上运行了 ProcessMonitor,我可以看到 msiexec 启动然后停止,而无需访问 C: 驱动器根目录中的 MSI 或尝试打开日志文件进行写入。
有没有人见过类似的东西?客户端机器是 Windows 7 pro、Powershell 4,目标机器是 Windows 2012 R2 和 PowerShell 4。
提前致谢。
尝试运行需要一些时间才能执行的脚本块或命令(尤其是安装活动)时,可能会出现此问题。该脚本在脚本块中的命令完成其活动之前返回。使用带有 -wait 参数的 Start-Process 让脚本等待,直到正在运行的命令完成并返回给脚本。我之前在远程机器上安装时注意到这一点,而在没有 Start-Process 的情况下在本地运行时似乎工作正常。
如您所见,正确的命令更改是: