I'm trying to do a quiet install using a Wix created msi. The thing is that there is absolutely no reporting on how the install has gone, i.e. whether it's succeeded or not.
At the moment, I'm logging everything to a file and checking the file afterwards, I'm just wondering whether there is a better way?
TIA
When you run an msi silently, msiexec will have an exit code. 0 and 3010 is 'good' (3010 means reboot needed ) everything else ( especially 1603 ) is bad.
List of error codes and error messages for Windows Installer processes
I would say this is what quiet install is all about - install quietly. :)
You might want to examine other command line switches starting from /q. This is the excerpt from the article about msiexec.exe:
/qn : Displays no user interface.
/qb : Displays a basic user interface.
/qr : Displays a reduced user interface with a modal dialog box
displayed at the end of the installation.
/qf : Displays the full user interface with a modal dialog box
displayed at the end.
/qn+ : Displays no user interface, except for a modal dialog box
displayed at the end.
/qb+ : Displays a basic user interface with a modal dialog box
displayed at the end.
/qb- : Displays a basic user interface with no modal dialog boxes.
If you only need to make sure it's there after the installation yourself, take a look at the add/remove programs console. If it's been installed, it is there (unless you tell it explicitly not to be).
You have gotten the right answer in terms of the exit codes, but I just want to add that another way to allow more "interactivity" whilst still suppressing most of the MSI GUI is to allow a modal dialog to be displayed at the end of the install. This is achieved by adding /QN+ to the msiexec.exe command line:
C:\Windows\system32\msiexec.exe /I "C:\test.msi" /QN+
This will make the install run silently, but a modal dialog will be show at the end of the setup telling you that the install completed.
There are many options with regards to suppressing parts of the GUI sequence, and the command lines to achieve this are sometimes confusing. Please check my post here for a tool that can help to demystify the command line syntax by auto generating it with a simple, free tool.
Related
I'm updating an InstallShield based installer. I've added a new managed custom action, written in C#, and packaged using Wix DTF.
Action is invoked correctly, and performs necessary actions.
Problem I have is showing an error message to user.
Method 1: MsiProcessMessage
From articles I've read, I understood that MsiProcessMessage is the correct way to do it, however this method does not work in UI sequence (before setup actually starts copying files and modifying system). In install sequence this method works. Code which I use is following:
Record record = new Record() { FormatString = "Password is not valid for this user." };
session.Message(
InstallMessage.Error | (InstallMessage)(MessageBoxIcon.Error) | (InstallMessage)MessageBoxButtons.OK,
record
);
Is it actually impossible to show an error message in UI sequence (Immediate execution) using MsiProcessMessage?
Method 2: MessageBox.Show
Using Windows.Forms works for showing a message box. However, message is displayed in background of setup wizard, and shows a separate icon in Windows taskbar.
Is there a way to get window handle of installation wizard, and that way solve this problem?
You didn't quite mention this, but I'm guessing that you are invoking your custom action off a DoAction ControlEvent, published off of something like a button click. Underneath the covers, this is very different from scheduling it in the InstallUISequence. MsiProcessMessage doesn't work from DoAction.
For proper integration with the Windows Installer UI experience, you should avoid using MessageBox.Show (your method 2). Better-integrated options include:
Tweaking a message that can be shown on the dialog from which you invoke this action
Showing a popup message by conditionally invoking a SpawnDialog ControlEvent
Showing an additional wizard panel by conditionally invoking a NewDialog ControlEvent
All three of those involve editing the UI of your project, but differently.
I am writing a wix project to deploy a website.
I am using the <iis:Certificate> element.
If the CertificatePath is not correct, or the PFXPassword is not correct, the installation failed, but the installer didn't prompt error message. I could only find the error in the log file.
Is there any way to prompt the user about the installation failure if there any error happens?
This is the way iis:Certificate element is implemented. Basically, it is a deferred custom action behind the scenes, which receives the information from another custom action and tries to do its job using the data it got.
All checks should go before the deferred part starts. I suspect that you pass the CertificatePath and PFXPassword as properties, and perhaps user enters the values. Anyway, you have to validate the values of those properties before letting it go further. If the value is not what you expect, you should prompt the user to fix it and don't let the installation flow to proceed without this.
It can be a custom action which is tied to the Next button on a wizard and doesn't let you move to the next dialog unless the properties are valid.
I would like to show the my custom dialog rather than the message box when Launch Condition failed in Wix. Normally, the message box of Launch Condition has OK button, but I would like to make more than that with some further actions with my dialog.
Could you please advise me how I can make it?
Thanks.
Dialogs can be sequenced using the InstallExecuteSequence and Custom elements. Schedule it prior to your Welcome dialog and after the LaunchConditions action. You may want an error custom action scheduled in the execute sequence to handle logging during silent installs.
You may also want to author your dialog into the main wizard loop (after install welcome ) using Publish elements also. It's hard to say without understanding your exact needs.
I am creating a installer using WIX, The requirement here is that when the user clicks on the next button on the license agreement dialog, I want to check the Internet spped of the user. If it is less than 1 mbps, I should show a message to the user that "the internet speed is less than the minimum required by the application. Do you still want to go ahead with the Installation?" This messagebox contains two buttons "Yes" and "No". If user clicks on Yes, I continue with the Installation. On click of "No", the Installation aborts.
I think this is impossible or may be quite difficult to do it with WIX. So thought of writing a C# Application, which will check the internet speed and show the dialog to the user. I want to launch this utility to be launched in the UI Sequence. Then capture whether user clicked on Yes or No, If user clicks on Yes, i continue with the Installation otherwise Installation aborts.
Note- When user clicks either Yes or No, the C# Application closes.
How can I :
1. Embed C# App in msi
2. Launch it in UI Sequence
3. Get the user action result and proceed accordingly.
Please help, it is urgent.
First, I question the value of doing this in an installer. Internet speed is highly variable and a user is just going to click yes and proceed. Any kind of system status check should really be inside your application.
But if you really want to have a Managed Custom Action in your installer that can set a property then you want to check out Deployment Tools Foundation.
WiX and DTF: Introduction
Deployment Tools Foundation (DTF) Managed Custom Actions
How long will it take for your code to determine internet speed? If it can do it in a few seconds then you can consider scheduling the custom action between CostInitialize and InstallFinalize. The CA will set a property and then you can use that property in your UI to decide if a warnign dialog that you author should be shown or not.
Again though, I have to suggest that this isn't a good idea.
I want to create a WIX Installer, during the prerequisites check, I want to see the amount of RAM Installed on the system.If it is less than 1 GB, It should show a Message to the user Indicating that "Amount of RAM on the system is less than the minimum required by this product. Do you still want to proceed with the Installation?"
There are two buttons in the message box shown (Yes and No). If User clicks on Yes, I continue with the Installation, If user clicks on No, I will just show the finish dialog or abort the Installation. How can I achieve this?
Windows Installer sets the system RAM amount in PhysicalMemory property. Usually this property is used as a launch condition which stops the installation and shows a message to the user.
Launch conditions do not allow the user to continue. So if this is not an option, a solution is to use a custom action. Your custom action can check PhysicalMemory and show a custom message box if it's not enough. Based on the user answer, the custom action can then return 0 to continue or 1602 to stop.
Here is a sample condition:
PhysicalMemory >= 1024
A custom action is no needed to implement your requirement. You can author a Windows Installer dialog and insert it between two other dialogs ( for example WelcomeDlg and VerifyReadyDlg ) to be conditionally called based on the PhysicalMemory property.
Here's what the ControlEvents and Conditions would look like for the WelcomeDlg:
SpawnDialog NotEnoughMemoryDlg PhysicalMemory < X
NewDialog VerifyReadyDlg 1
Then you create a dialog that looks like a mesage box and call it NotEnoughMemoryDlg. Have a ControlEvent for the Yes button of EndDialog Return 1. Have a ControlEvent for the No button that says EndDialog Exit 1.
If the system has enough memory it'll skip over the call to the custom dialog. If the system doesn't have enough memory it'll call the dialog. If the user clicks yes it'll return and fall through to the next control event which takes you to VerifyReadyDlg. If the user clicks no, it'll return with a cancel message and invoke the setup completed cancelled dialog.
I don't really do much UI work in WiX ( I mainly use InstallShield but the underlying MSI concepts are the same ) so I can't really give you "do this" code. Especially since I don't know what your current WiX UI code looks like. ( Are you using the WiXUI extension? )
You can follow my instructions to show a non-blocking warning for the operating system. Adapting those instructions to warn about the value of the PhysicalMemory property as mentioned by Cosmin shouldn't be too difficult.