Installing an MSP using Powershell works on the local machine, fails remotely. Why?

Roy Martin picture Roy Martin · May 15, 2013 · Viewed 7k times · Source

I need some Powershell advice.

I need to install an application's MSP update file on multiple Win08r2 servers. If I run these commands locally, within the target machine's PS window, it does exactly what I want it to:

$command = 'msiexec.exe /p "c:\test\My Application Update 01.msp" REBOOTPROMPT=S /qb!'
invoke-wmimethod -path win32_process -name create -argumentlist $command

The file being executed is located on the target machine

If I remotely connect to the machine, and execute the two commands, it opens two x64 msiexec.exe process, and one msiexec.exe *32 process, and just sits there.

If I restart the server, it doesn't show that the update was installed, so I don't think it's a timing thing.

I've tried creating and remotely executing a PS1 file with the two lines, but that seems to do the same thing.

If anyone has advice on getting my MSP update installed remotely, I'd be all ears.

I think I've included all the information I have, but if something is missing, please ask questions, and I'll fill in any blanks.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

My process for this is:

  • Read a CSV for server name and Administrator password
  • Create a credential with the password
  • Create a new session using the machine name and credential
  • Create a temporary folder to hold my update MSP file
  • Call a PS1 file that downloads the update file to the target server
  • >>> Creates a new System.Net.WebClient object
  • >>> Uses that web client object to download from the source to the location on the target server
  • Call another PS1 file that applies the patch that was just downloaded –>> This is where I’m having issues.
  • >>> Set the variable shown above
  • >>> Execute the file specified in the variable
  • Close the session to the target server
  • Move to the next server in the CSV…

If I open a PS window and manually set the variable, then execute it (as shown above in the two lines of code), it works fine. If I create a PS1 file on the target server, containing the same two lines of code, then right click > ‘Run With PowerShell’ it works as expected / desired. If I remotely execute my code in PowerGUI, it returns a block of text that looks like this, then just sits there. RDP’d into the server, the installer never launches. My understanding of the “Return Value” value is that “0″ means the command was successful.

PSComputerName : xx.xx.xx.xx
RunspaceId : bf6f4a39-2338-4996-b75b-bjf5ef01ecaa
PSShowComputerName : True
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ProcessId : 4808
ReturnValue : 0

I even added a line of code between the variable and the execution that creates a text file on the desktop, just to verify I was getting into my ‘executeFile’ file, and that text file does get created. It seems that it’s just not remotely executing my MSP.

Thank you in advance for your assistance!

Catt11.

Answer

Jason Bray picture Jason Bray · Oct 30, 2013

Here's the strategy I used to embed an msp into a powershell script. It works perfectly for me.

$file = "z:\software\AcrobatUpdate.msp"
$silentArgs = "/passive"
$additionalInstallArgs = ""
Write-Debug "Running msiexec.exe /update $file $silentArgs"
$msiArgs = "/update `"$file`""
$msiArgs = "$msiArgs $silentArgs $additionalInstallArgs"
Start-Process -FilePath msiexec -ArgumentList $msiArgs -Wait

You probably don't need to use the variables if you don't want to, you could hardcode the values. I have this set up as a function to which I pass those arguments, but if this is more of a one-shot deal, it might be easier to hard-code the values.

Hope that helps!