Multiple MSI installs via BAT scripts

Hello,

We are attempting to deploy call recording software that requires at least 4-5 MSI installs per agent and supervisor machine. We have BAT scripts to accomplish this for both agent and supervisor. What is the best way to utilize Bigfix for this? I’d like to utilize Bigfix to download the MSIs if possible as we don’t have file servers to hang a share off of - using BOX in the organization. Any assistance would be greatly appreciated.

I’d start with the Manage Software Distribution dashboard. It can handle uploading your files to the BigFix server and creating Tasks to deploy to the clients.

Since you need to run multiple MSI packages, you’ll need to customize the generated ActionScript. The wizard has some links to docs that should help.
.

3 Likes

Ok, thanks for the reply. Obviously I’ve only ever used the Software Distribution Wizard for one package at a time. Few questions:

If I select the folder option, does that download the folder with all MSIs to the machine? And that is to the __Download folder?
In our BAT script we are setting a directory location where the MSIs are located and then setting an install directory as well. Would the MSIs directory be the __Download folder for the BES Client?
Which is better to do - place the BAT script in the folder being downloaded to the machine and then call it from the action script or create the BAT script from the action script? Anyone have a template of what this might look like?

When you select a folder, the folder containing MSIs would be downloaded to the client and decompressed to __Download. You could either include the .BAT in the folder before you upload it, or build the .bat on the fly in the action script and reference __Download\package1.msi, __Download\package2.msi, etc.

2 Likes

Thank you very much for your replies.

How does the below action script look? You said the folder i select (called Verint in this case) gets extracted in the __Download folder - so the MSIS DIR would just be __Download and not __Download\Verint?

prefetch ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e sha1:ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e size:225269469 http://servername.domain.COM:52311/Uploads/ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e/Verint.tmp sha256:39cd6475aeb5e1d9fb930e325d6495dfd3a14a0975a5dc6fd6927431a3353ca0
extract ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e

delete __createfile
// CREATEFILE
createfile until END_OF_FILE

@echo off
setlocal
REM The script uses parameters for silent reboot when reboot is required
REM Continue running the script after each reboot until each script is installed successfully
REM If installation fails, the EXIT_CODE is 1


set MSIS_DIR=__Download\Verint
set INSTALLFOLDER=C:\Program Files\Verint\DesktopApplications

SET EXIT_CODE=0

echo Desktop Resources Installation
msiexec -i "__Download\Verint\DesktopResources-KB190992-Verint-15.2.7.15.msi" USE_COMMAND_LINE=1 TARGETDIR="%INSTALLFOLDER%" /qn
IF %errorlevel% NEQ 0 (
SET /A EXIT_CODE=1
echo ---installer failed
) ELSE (
echo ---installer succeeded
)


echo Screen Capture Module
msiexec /i "__Download\Verint\ScreenCapture-KB181217-15.2.5.658.msi" USE_COMMAND_LINE=1 INSTALLDIR="c:\CaptureService\" ENCRYPTION_DATAENCRYPT=TRUE CONN_INTG_SVC=TRUE INTG_SERVERS=servername.com:port,servername.com:port /qn
IF %errorlevel% NEQ 0 (
SET /A EXIT_CODE=1
echo ---installer failed
) ELSE (
echo ---installer succeeded
)



echo Desktop Connection Manager
msiexec /i "__Download\Verint\DesktopConnectionManager-KB181233-15.2.7.14.msi" SERVERADDR=servername.com DRSERVER=MyDRServ USEFQDN=Yes USEHTTPS=Y /qn
IF %errorlevel% NEQ 0 (
SET /A EXIT_CODE=1
echo ---installer failed
) ELSE (
echo ---installer succeeded
)

echo Desktop Messaging Client
msiexec /i "__Download\Verint\DesktopMessagingClient-KB192725-15.2.7.17.msi" AUTOSTART=Y /qn
IF %errorlevel% NEQ 0 (
SET /A EXIT_CODE=1
echo ---installer failed
) ELSE (
echo ---installer succeeded
)

END_OF_FILE

delete agent.bat
move __createfile agent.bat

override wait
hidden=true
completion=job
wait agent.bat

Honestly it usually takes me a couple of tries before I get the folder structure right. It depends somewhat on what folder level you selected to upload through the dashboard, I’m not sure whether you’ll see everything in the root directory __Download or if it would create __Download\Verint for you.

Otherwise, all looks good to me.

1 Like

Appreciate the reply.

We tested this today and it completed on the machine however confirmed with user the software did not install. I would Imagine if the folder structure wasn’t correct excuting the MSI, the would have been a failure in the action info which there wasn’t. Thoughts?

I still have to look at the logs.

Checking the logs is a good first step. Also from the console you can check the Exit Code of the action.

It looks like the batch file itself does some checking and should return an error code in %ERRORLEVEL%, and we should see that as the exit code of the action - but we don’t base the action’s success or failure on that code.

You could add your own trap for that - after the batch executes, you could add an action script command to terminate if the batch file returned a non-zero code

continue if {exit code of action = 0 or exit code of action = 3010}

edit: Added exit code checks for 0 or 3010 (3010 indicating a successful install that requires a reboot to complete)

1 Like

Thanks. Yeah exit code was 0 in the console.

I copied the task and I am attempting it without the Verint folder in the MSI dir as well. I’ll also try what you sugggested.

One thing that I like to do is use “Compress folders at depth 0” whenever I’m deploying a folder structure and specify a Root folder during the extract.

In the task I modify the extract command like so:
extract "Quadro_T1000_461.bftemp" "{parameter "baseFolder"}/Root"

This ensures that everything will be in the Root folder or whatever you decide to call it later on in the script.

For instance. later in the action I may copy it to C:\Windows\Temp and I can move like so:
waithidden cmd /C xcopy /y /s /c /i __Download\Root\"." C:\Windows\Temp\Root\

And then run it from there.
waithidden cmd /C "c:\windows\temp\Root\Win10-DCH_64\International\setup.exe" -s -noeula -noreboot

Here are the logs::

At 16:10:40 -0500 - 
   ActionLogMessage: (action:2676806) Action signature verified for Execution
   ActionLogMessage: (action:2676806) starting action
At 16:10:40 -0500 - actionsite (http://servername.COM:52311/cgi-bin/bfgather.exe/actionsite)
   Command succeeded (Prefetch download manager collected file) prefetch ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e sha1:ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e size:225269469 http://servername.COM:52311/Uploads/ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e/Verint.tmp sha256:39cd6475aeb5e1d9fb930e325d6495dfd3a14a0975a5dc6fd6927431a3353ca0 (action:2676806)
At 16:10:44 -0500 - actionsite (http://servername.COM:52311/cgi-bin/bfgather.exe/actionsite)
   Command succeeded extract ba2d9e7a4d2a206030e6d7cb67bdd097966cca9e (action:2676806)
   Command succeeded delete No 'C:\Program Files (x86)\BigFix Enterprise\BES Client\__BESData\opsite10\__createfile' exists to delete, no failure reported (action:2676806)
   Command succeeded createfile until  (action:2676806)
   Command succeeded delete No 'C:\Program Files (x86)\BigFix Enterprise\BES Client\__BESData\opsite10\agent.bat' exists to delete, no failure reported (action:2676806)
   Command succeeded move __createfile agent.bat (action:2676806)
   Command succeeded override wait (action:2676806)
   Command succeeded override hidden=true (action:2676806)
   Command succeeded override completion=job (action:2676806)
   Command started - wait agent.bat (action:2676806)
   Command succeeded (Exit Code=0) wait agent.bat (action:2676806)
At 16:10:44 -0500 - 
   ActionLogMessage: (action:2676806) ending action

I dont see an issue in the logs, does anyone else?

You may have to watch what’s happening on the endpoint, what the directory structure looks like after extraction, and whether the install command lines work when you run them manually.

Software is confirmed installed after reboot. Thanks for the replies.

One more question. As far as sucess criteria goes, I am attempting to use:

exists regapp “application name”

which doesn’t appear to be working. Any similar methods I can use?

Uninstall area of the registry is pretty popular for MSI based install detections.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

I don’t know your software GUIDs, but I can give an example for the BigFix Agent.

q: exists key "{FE0AB6C5-C40A-47AD-A44B-0F7A273B68DD}" of keys "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" of (registry;native registry)

1 Like

Hi all, would the above action script that was provided above in which a BAT script is being created, would that need elevated priviledges to run? I would imagine if it did, it would fail?

BigFix agent runs as local system, so it already has elevated privileges needed to uninstall most software.

I haven’t tried this in a very long time, so I have no clue if it still works, but I have a Python script that takes a folder of MSI files as input and generates Installer and Uninstaller tasks in BigFix from them:

Even though it is generic python, the msilib module it uses is windows only.

2 Likes

As always, thanks very much to all for the replies.

The BAT script works when it is used manually, and it also states that it completes via Bigfix as well since there are some exit code checks built to it and also in the Bigfix action script. However, Vendor is claiming that when the install is done via Bigfix, certain folders do not get created from the install.

This is a terrible convoluted application we are installing so I don’t see anything being wrong with Bigfix. I know Bigfix runs as a system account, and figured it had enough privileges as we have never had an issue pushing software before. Just wanted to confirm things. Thanks again.

If needed, you can also experiment with the OVERRIDE commands and run in the currently logged on user’s context.

https://developer.bigfix.com/action-script/reference/execution/override.html