2013-03-05 6 views
0

Я пытаюсь запустить следующую команду на удаленном компьютере для удаления предыдущей версии продукта до установки другой версии. Это удаление с помощью MsiExec.exe.PSRemotingTransportException при вызове Start-Process «MsiExec.exe» на удаленном компьютере

Всякий раз, когда я вызываю Start-Process, процесс фактически запускается, и продукт удаляется на удаленном компьютере, но я получаю приведенное ниже исключение. Если продукт еще не установлен, а строка Start-Process не запускается, удаленная команда работает отлично, без исключения. (т. е. он фактически ищет реестр, не находит продукт и возвращает -1 без исключения). Проблема возникает только при вызове Start-Process.

Вот мой код сценария ...

$UninstallScriptBlock = { 
    param ([string]$InstallerProductName) 

    $ErrorActionPreference = "Stop"; 

    $UninstallRegPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
    $ProductCode = Get-ChildItem -Path $UninstallRegPath | foreach { if ($_.GetValue("DisplayName") -eq $InstallerProductName) { [System.IO.Path]::GetFileName($_); } } 
    if ([string]::IsNullOrEmpty($ProductCode)) 
    { 
     $UninstallRegPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; 
     $ProductCode = Get-ChildItem -Path $UninstallRegPath | foreach { if ($_.GetValue("DisplayName") -eq $InstallerProductName) { [System.IO.Path]::GetFileName($_); } } 
    } 
    if ([string]::IsNullOrEmpty($ProductCode)) 
    { 
     return -1; 
    } 

    $Process = Start-Process -Wait -Passthru -FilePath "MsiExec.exe" -ArgumentList "/X", $ProductCode, "/qn"; 
    return $Process.ExitCode; 
} 

[int]$UninstallReturnCode = Invoke-Command -ComputerName $Server -ScriptBlock $UninstallScriptBlock -ArgumentList $InstallerProductName -SessionOption (New-PSSessionOption -OperationTimeout 0); 

И брошено исключение ...

Processing data for a remote command failed with the following error message: The I/O operation has been aborted because of either a thread exit or an application request. For more information, see the about_Remote_Troubleshooting Help topic. 
At [Undisclosed] 
+  [int]$UninstallReturnCode = Invoke-Command -ComputerName $Server -ScriptBloc ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : OperationStopped: ([UndisclosedServerName]:String) [], PSRemotingTransportException 
+ FullyQualifiedErrorId : JobFailure 
+ PSComputerName  : [UndisclosedServerName] 

И отформатирован ошибка ...

ErrorCode     : 995 
TransportMessage   : The I/O operation has been aborted because of either a thread exit or an application request. 

ErrorRecord     : Processing data for a remote command failed with the following error message: The I/O 
           operation has been aborted because of either a thread exit or an application request. For 
           more information, see the about_Remote_Troubleshooting Help topic. 
StackTrace     : 
WasThrownFromThrowStatement : False 
Message      : Processing data for a remote command failed with the following error message: The I/O 
           operation has been aborted because of either a thread exit or an application request. For 
           more information, see the about_Remote_Troubleshooting Help topic. 
Data      : {} 
InnerException    : 
TargetSite     : 
HelpLink     : 
Source      : 
+0

Что вы получите, если вы выполните: «$ Ошибка [0]. Исключение | Формат-список * -Force» после исключения? –

+0

Добавлена ​​форматированная ошибка для публикации. – TylerOhlsen

+0

Я думаю, что я обнаружил проблему. Я думаю, что мой установщик перезагружает IIS и, следовательно, отключает мое соединение с PowerShell Remoting. Означает ли это, что это возможно? – TylerOhlsen

ответ

1

Лучший ответ я может обнаружить, что моя деинсталляция - это сброс IIS, что приводит к отключению моего соединения с PowerShell Remoting.

Это то, что я сделал как работа вокруг:

  1. Снимите -wait из Start-процесса и сразу же закрыть сессию Powershell Remoting.
  2. После закрытия сеанса PowerShell Remoting запустите Start-Sleep, чтобы дождаться завершения удаления (с учетом того, как долго будет выполняться удаление, плюс некоторое дополнение).
  3. Прочтите файл журнала удаления для текста «Удаленный успех или статус ошибки: XXXX». Где XXXX - код возврата процесса удаления.